latency.cpp revision 97960af1f651349fba21fc67be644e49711a4263
1943eb670c86242755f5af7460d46578243e0401eTim Murray#include "RenderScript.h" 2943eb670c86242755f5af7460d46578243e0401eTim Murray#include <sys/time.h> 3943eb670c86242755f5af7460d46578243e0401eTim Murray 4943eb670c86242755f5af7460d46578243e0401eTim Murray#include "ScriptC_latency.h" 5943eb670c86242755f5af7460d46578243e0401eTim Murray 6943eb670c86242755f5af7460d46578243e0401eTim Murrayusing namespace android; 7943eb670c86242755f5af7460d46578243e0401eTim Murrayusing namespace renderscriptCpp; 8943eb670c86242755f5af7460d46578243e0401eTim Murray 9943eb670c86242755f5af7460d46578243e0401eTim Murrayint main(int argc, char** argv) 10943eb670c86242755f5af7460d46578243e0401eTim Murray{ 11943eb670c86242755f5af7460d46578243e0401eTim Murray int iters = 100; 12943eb670c86242755f5af7460d46578243e0401eTim Murray int numElems = 1000; 1397960af1f651349fba21fc67be644e49711a4263Tim Murray bool forceCpu = false; 14943eb670c86242755f5af7460d46578243e0401eTim Murray 15943eb670c86242755f5af7460d46578243e0401eTim Murray if (argc >= 2) { 16943eb670c86242755f5af7460d46578243e0401eTim Murray iters = atoi(argv[1]); 17943eb670c86242755f5af7460d46578243e0401eTim Murray if (iters <= 0) { 18943eb670c86242755f5af7460d46578243e0401eTim Murray printf("iters must be positive\n"); 19943eb670c86242755f5af7460d46578243e0401eTim Murray return 1; 20943eb670c86242755f5af7460d46578243e0401eTim Murray } 21943eb670c86242755f5af7460d46578243e0401eTim Murray } 22943eb670c86242755f5af7460d46578243e0401eTim Murray 23943eb670c86242755f5af7460d46578243e0401eTim Murray printf("iters = %d\n", iters); 24943eb670c86242755f5af7460d46578243e0401eTim Murray 25943eb670c86242755f5af7460d46578243e0401eTim Murray if (argc >= 3) { 26943eb670c86242755f5af7460d46578243e0401eTim Murray numElems = atoi(argv[2]); 27943eb670c86242755f5af7460d46578243e0401eTim Murray if (numElems <= 0) { 28943eb670c86242755f5af7460d46578243e0401eTim Murray printf("numElems must be positive\n"); 29943eb670c86242755f5af7460d46578243e0401eTim Murray return 1; 30943eb670c86242755f5af7460d46578243e0401eTim Murray } 31943eb670c86242755f5af7460d46578243e0401eTim Murray } 32943eb670c86242755f5af7460d46578243e0401eTim Murray 3397960af1f651349fba21fc67be644e49711a4263Tim Murray if (argc >= 4) { 3497960af1f651349fba21fc67be644e49711a4263Tim Murray int temp = atoi(argv[3]); 3597960af1f651349fba21fc67be644e49711a4263Tim Murray if (temp != 0) 3697960af1f651349fba21fc67be644e49711a4263Tim Murray forceCpu = true; 3797960af1f651349fba21fc67be644e49711a4263Tim Murray } 3897960af1f651349fba21fc67be644e49711a4263Tim Murray 3997960af1f651349fba21fc67be644e49711a4263Tim Murray if (forceCpu) 4097960af1f651349fba21fc67be644e49711a4263Tim Murray printf("forcing CPU\n"); 4197960af1f651349fba21fc67be644e49711a4263Tim Murray 42943eb670c86242755f5af7460d46578243e0401eTim Murray printf("numElems = %d\n", numElems); 43943eb670c86242755f5af7460d46578243e0401eTim Murray 44943eb670c86242755f5af7460d46578243e0401eTim Murray sp<RS> rs = new RS(); 45943eb670c86242755f5af7460d46578243e0401eTim Murray 4697960af1f651349fba21fc67be644e49711a4263Tim Murray bool r = rs->init(forceCpu); // force CPU execution 47943eb670c86242755f5af7460d46578243e0401eTim Murray 48943eb670c86242755f5af7460d46578243e0401eTim Murray sp<const Element> e = Element::U32(rs); 49943eb670c86242755f5af7460d46578243e0401eTim Murray 50943eb670c86242755f5af7460d46578243e0401eTim Murray Type::Builder tb(rs, e); 51943eb670c86242755f5af7460d46578243e0401eTim Murray tb.setX(numElems); 52943eb670c86242755f5af7460d46578243e0401eTim Murray sp<const Type> t = tb.create(); 53943eb670c86242755f5af7460d46578243e0401eTim Murray 54943eb670c86242755f5af7460d46578243e0401eTim Murray sp<Allocation> ain = Allocation::createTyped(rs, t); 55943eb670c86242755f5af7460d46578243e0401eTim Murray sp<Allocation> aout = Allocation::createTyped(rs, t); 56943eb670c86242755f5af7460d46578243e0401eTim Murray 57943eb670c86242755f5af7460d46578243e0401eTim Murray sp<ScriptC_latency> sc = new ScriptC_latency(rs, NULL, 0); 58943eb670c86242755f5af7460d46578243e0401eTim Murray 59943eb670c86242755f5af7460d46578243e0401eTim Murray struct timeval start, stop; 60943eb670c86242755f5af7460d46578243e0401eTim Murray 61943eb670c86242755f5af7460d46578243e0401eTim Murray gettimeofday(&start, NULL); 62943eb670c86242755f5af7460d46578243e0401eTim Murray 63943eb670c86242755f5af7460d46578243e0401eTim Murray for (int i = 0; i < iters; i++) { 64943eb670c86242755f5af7460d46578243e0401eTim Murray sc->forEach_root(ain, aout); 65943eb670c86242755f5af7460d46578243e0401eTim Murray } 66943eb670c86242755f5af7460d46578243e0401eTim Murray 67943eb670c86242755f5af7460d46578243e0401eTim Murray uint32_t temp; 68943eb670c86242755f5af7460d46578243e0401eTim Murray 69943eb670c86242755f5af7460d46578243e0401eTim Murray aout->copy1DRangeFromUnchecked(0, 1, &temp, sizeof(temp)); 70943eb670c86242755f5af7460d46578243e0401eTim Murray 71943eb670c86242755f5af7460d46578243e0401eTim Murray gettimeofday(&stop, NULL); 72943eb670c86242755f5af7460d46578243e0401eTim Murray 73943eb670c86242755f5af7460d46578243e0401eTim Murray long long elapsed = (stop.tv_sec * 1000000) - (start.tv_sec * 1000000) + (stop.tv_usec - start.tv_usec); 74943eb670c86242755f5af7460d46578243e0401eTim Murray printf("elapsed time : %lld microseconds\n", elapsed); 75943eb670c86242755f5af7460d46578243e0401eTim Murray printf("time per iter: %f microseconds\n", (double)elapsed / iters); 76943eb670c86242755f5af7460d46578243e0401eTim Murray 77943eb670c86242755f5af7460d46578243e0401eTim Murray sc.clear(); 78943eb670c86242755f5af7460d46578243e0401eTim Murray t.clear(); 79943eb670c86242755f5af7460d46578243e0401eTim Murray e.clear(); 80943eb670c86242755f5af7460d46578243e0401eTim Murray ain.clear(); 81943eb670c86242755f5af7460d46578243e0401eTim Murray aout.clear(); 82943eb670c86242755f5af7460d46578243e0401eTim Murray} 83