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; 79eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC; 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; 144d252d6e807b89764dad123ac845df298c52ca97Tim Murray bool synchronous = false; 15943eb670c86242755f5af7460d46578243e0401eTim Murray 16943eb670c86242755f5af7460d46578243e0401eTim Murray if (argc >= 2) { 17943eb670c86242755f5af7460d46578243e0401eTim Murray iters = atoi(argv[1]); 18943eb670c86242755f5af7460d46578243e0401eTim Murray if (iters <= 0) { 19943eb670c86242755f5af7460d46578243e0401eTim Murray printf("iters must be positive\n"); 20943eb670c86242755f5af7460d46578243e0401eTim Murray return 1; 21943eb670c86242755f5af7460d46578243e0401eTim Murray } 22943eb670c86242755f5af7460d46578243e0401eTim Murray } 23943eb670c86242755f5af7460d46578243e0401eTim Murray 24943eb670c86242755f5af7460d46578243e0401eTim Murray printf("iters = %d\n", iters); 25943eb670c86242755f5af7460d46578243e0401eTim Murray 26943eb670c86242755f5af7460d46578243e0401eTim Murray if (argc >= 3) { 27943eb670c86242755f5af7460d46578243e0401eTim Murray numElems = atoi(argv[2]); 28943eb670c86242755f5af7460d46578243e0401eTim Murray if (numElems <= 0) { 29943eb670c86242755f5af7460d46578243e0401eTim Murray printf("numElems must be positive\n"); 30943eb670c86242755f5af7460d46578243e0401eTim Murray return 1; 31943eb670c86242755f5af7460d46578243e0401eTim Murray } 32943eb670c86242755f5af7460d46578243e0401eTim Murray } 33943eb670c86242755f5af7460d46578243e0401eTim Murray 3497960af1f651349fba21fc67be644e49711a4263Tim Murray if (argc >= 4) { 3597960af1f651349fba21fc67be644e49711a4263Tim Murray int temp = atoi(argv[3]); 3697960af1f651349fba21fc67be644e49711a4263Tim Murray if (temp != 0) 3797960af1f651349fba21fc67be644e49711a4263Tim Murray forceCpu = true; 3897960af1f651349fba21fc67be644e49711a4263Tim Murray } 3997960af1f651349fba21fc67be644e49711a4263Tim Murray 404d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (argc >= 5) { 414d252d6e807b89764dad123ac845df298c52ca97Tim Murray int temp = atoi(argv[4]); 424d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (temp != 0) 434d252d6e807b89764dad123ac845df298c52ca97Tim Murray synchronous = true; 444d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 454d252d6e807b89764dad123ac845df298c52ca97Tim Murray 4697960af1f651349fba21fc67be644e49711a4263Tim Murray if (forceCpu) 4797960af1f651349fba21fc67be644e49711a4263Tim Murray printf("forcing CPU\n"); 4897960af1f651349fba21fc67be644e49711a4263Tim Murray 494d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (synchronous) 504d252d6e807b89764dad123ac845df298c52ca97Tim Murray printf("forcing synchronous\n"); 514d252d6e807b89764dad123ac845df298c52ca97Tim Murray 52943eb670c86242755f5af7460d46578243e0401eTim Murray printf("numElems = %d\n", numElems); 53943eb670c86242755f5af7460d46578243e0401eTim Murray 54943eb670c86242755f5af7460d46578243e0401eTim Murray sp<RS> rs = new RS(); 55943eb670c86242755f5af7460d46578243e0401eTim Murray 56525342999140d69b9f5673f3036f836c66a983c4Tim Murray uint32_t flags = 0; 57525342999140d69b9f5673f3036f836c66a983c4Tim Murray if (forceCpu) flags |= RS_INIT_LOW_LATENCY; 58525342999140d69b9f5673f3036f836c66a983c4Tim Murray if (synchronous) flags |= RS_INIT_SYNCHRONOUS; 59525342999140d69b9f5673f3036f836c66a983c4Tim Murray 60caf4126512b2152ea5f6573ce5d9ca29767b9678Tim Murray bool r = rs->init("/system/bin", flags); 61943eb670c86242755f5af7460d46578243e0401eTim Murray 62943eb670c86242755f5af7460d46578243e0401eTim Murray sp<const Element> e = Element::U32(rs); 63943eb670c86242755f5af7460d46578243e0401eTim Murray 64943eb670c86242755f5af7460d46578243e0401eTim Murray Type::Builder tb(rs, e); 65943eb670c86242755f5af7460d46578243e0401eTim Murray tb.setX(numElems); 66943eb670c86242755f5af7460d46578243e0401eTim Murray sp<const Type> t = tb.create(); 67943eb670c86242755f5af7460d46578243e0401eTim Murray 684d252d6e807b89764dad123ac845df298c52ca97Tim Murray uint32_t *buf = new uint32_t[numElems]; 694d252d6e807b89764dad123ac845df298c52ca97Tim Murray 70943eb670c86242755f5af7460d46578243e0401eTim Murray sp<Allocation> ain = Allocation::createTyped(rs, t); 71943eb670c86242755f5af7460d46578243e0401eTim Murray sp<Allocation> aout = Allocation::createTyped(rs, t); 72943eb670c86242755f5af7460d46578243e0401eTim Murray 7341efe87eb48ed945df2f26f4dff0eb5e00b8eebeStephen Hines sp<ScriptC_latency> sc = new ScriptC_latency(rs); 74943eb670c86242755f5af7460d46578243e0401eTim Murray 75943eb670c86242755f5af7460d46578243e0401eTim Murray struct timeval start, stop; 76943eb670c86242755f5af7460d46578243e0401eTim Murray 7744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes gettimeofday(&start, nullptr); 78943eb670c86242755f5af7460d46578243e0401eTim Murray 79943eb670c86242755f5af7460d46578243e0401eTim Murray for (int i = 0; i < iters; i++) { 80943eb670c86242755f5af7460d46578243e0401eTim Murray sc->forEach_root(ain, aout); 81943eb670c86242755f5af7460d46578243e0401eTim Murray } 82943eb670c86242755f5af7460d46578243e0401eTim Murray 83a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray rs->finish(); 84943eb670c86242755f5af7460d46578243e0401eTim Murray 8544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes gettimeofday(&stop, nullptr); 86943eb670c86242755f5af7460d46578243e0401eTim Murray 87943eb670c86242755f5af7460d46578243e0401eTim Murray long long elapsed = (stop.tv_sec * 1000000) - (start.tv_sec * 1000000) + (stop.tv_usec - start.tv_usec); 88943eb670c86242755f5af7460d46578243e0401eTim Murray printf("elapsed time : %lld microseconds\n", elapsed); 89943eb670c86242755f5af7460d46578243e0401eTim Murray printf("time per iter: %f microseconds\n", (double)elapsed / iters); 90943eb670c86242755f5af7460d46578243e0401eTim Murray 9144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes gettimeofday(&start, nullptr); 924d252d6e807b89764dad123ac845df298c52ca97Tim Murray 934d252d6e807b89764dad123ac845df298c52ca97Tim Murray for (int i = 0; i < iters; i++) { 944d252d6e807b89764dad123ac845df298c52ca97Tim Murray ain->copy1DFrom(buf); 954d252d6e807b89764dad123ac845df298c52ca97Tim Murray sc->forEach_root(ain, aout); 964d252d6e807b89764dad123ac845df298c52ca97Tim Murray aout->copy1DTo(buf); 974d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 984d252d6e807b89764dad123ac845df298c52ca97Tim Murray 994d252d6e807b89764dad123ac845df298c52ca97Tim Murray rs->finish(); 1004d252d6e807b89764dad123ac845df298c52ca97Tim Murray 10144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes gettimeofday(&stop, nullptr); 1024d252d6e807b89764dad123ac845df298c52ca97Tim Murray elapsed = (stop.tv_sec * 1000000) - (start.tv_sec * 1000000) + (stop.tv_usec - start.tv_usec); 1034d252d6e807b89764dad123ac845df298c52ca97Tim Murray printf("elapsed time with copy : %lld microseconds\n", elapsed); 1044d252d6e807b89764dad123ac845df298c52ca97Tim Murray printf("time per iter with copy: %f microseconds\n", (double)elapsed / iters); 1054d252d6e807b89764dad123ac845df298c52ca97Tim Murray 106943eb670c86242755f5af7460d46578243e0401eTim Murray sc.clear(); 107943eb670c86242755f5af7460d46578243e0401eTim Murray t.clear(); 108943eb670c86242755f5af7460d46578243e0401eTim Murray e.clear(); 109943eb670c86242755f5af7460d46578243e0401eTim Murray ain.clear(); 110943eb670c86242755f5af7460d46578243e0401eTim Murray aout.clear(); 111943eb670c86242755f5af7460d46578243e0401eTim Murray} 112