1e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey#include "RenderScript.h" 2e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey#include <sys/time.h> 3e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 4e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey#include "ScriptC_latency.h" 5e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 6e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkeyusing namespace android; 7e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkeyusing namespace RSC; 8e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 9e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkeyint main(int argc, char** argv) 10e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey{ 11e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey int iters = 100; 12e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey int numElems = 1000; 13e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey bool forceCpu = false; 14e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey bool synchronous = false; 15e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 16e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey if (argc >= 2) { 17e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey iters = atoi(argv[1]); 18e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey if (iters <= 0) { 19bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey printf("iters must be positive\n"); 20bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey return 1; 21e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey } 22e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey } 23e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 24e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey printf("iters = %d\n", iters); 25e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 26e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey if (argc >= 3) { 27e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey numElems = atoi(argv[2]); 28e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey if (numElems <= 0) { 29e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey printf("numElems must be positive\n"); 30e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey return 1; 31e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey } 32e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey } 33e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 34bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey if (argc >= 4) { 35bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey int temp = atoi(argv[3]); 36bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey if (temp != 0) 37bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey forceCpu = true; 38bc09755e193c2802d2d88871ac3d1f182b260c30Jeff Sharkey } 39e0b0bef75b66f0a87039c8f58c17b1596a2baebeJeff Sharkey 40 if (argc >= 5) { 41 int temp = atoi(argv[4]); 42 if (temp != 0) 43 synchronous = true; 44 } 45 46 if (forceCpu) 47 printf("forcing CPU\n"); 48 49 if (synchronous) 50 printf("forcing synchronous\n"); 51 52 printf("numElems = %d\n", numElems); 53 54 sp<RS> rs = new RS(); 55 56 uint32_t flags = 0; 57 if (forceCpu) flags |= RS_INIT_LOW_LATENCY; 58 if (synchronous) flags |= RS_INIT_SYNCHRONOUS; 59 60 bool r = rs->init("/system/bin", flags); 61 62 sp<const Element> e = Element::U32(rs); 63 64 Type::Builder tb(rs, e); 65 tb.setX(numElems); 66 sp<const Type> t = tb.create(); 67 68 uint32_t *buf = new uint32_t[numElems]; 69 70 sp<Allocation> ain = Allocation::createTyped(rs, t); 71 sp<Allocation> aout = Allocation::createTyped(rs, t); 72 73 sp<ScriptC_latency> sc = new ScriptC_latency(rs); 74 75 struct timeval start, stop; 76 77 gettimeofday(&start, NULL); 78 79 for (int i = 0; i < iters; i++) { 80 sc->forEach_root(ain, aout); 81 } 82 83 rs->finish(); 84 85 gettimeofday(&stop, NULL); 86 87 long long elapsed = (stop.tv_sec * 1000000) - (start.tv_sec * 1000000) + (stop.tv_usec - start.tv_usec); 88 printf("elapsed time : %lld microseconds\n", elapsed); 89 printf("time per iter: %f microseconds\n", (double)elapsed / iters); 90 91 gettimeofday(&start, NULL); 92 93 for (int i = 0; i < iters; i++) { 94 ain->copy1DFrom(buf); 95 sc->forEach_root(ain, aout); 96 aout->copy1DTo(buf); 97 } 98 99 rs->finish(); 100 101 gettimeofday(&stop, NULL); 102 elapsed = (stop.tv_sec * 1000000) - (start.tv_sec * 1000000) + (stop.tv_usec - start.tv_usec); 103 printf("elapsed time with copy : %lld microseconds\n", elapsed); 104 printf("time per iter with copy: %f microseconds\n", (double)elapsed / iters); 105 106 sc.clear(); 107 t.clear(); 108 e.clear(); 109 ain.clear(); 110 aout.clear(); 111} 112