Advertisement
MonoS

Test code and result for MVTools ToPixels

Dec 12th, 2015
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.56 KB | None | 0 0
  1. CPU: Intel Xeon E3-1240v3 @3.40GHz
  2.  
  3. Test code:
  4. #include <emmintrin.h>
  5. #include <immintrin.h>
  6. #include <avx2intrin.h>
  7. #include <cstdint>
  8. #include <random>
  9. #include <cstdio>
  10. #include <intrin.h>
  11.  
  12. #ifndef min
  13. #define min(a,b)            (((a) < (b)) ? (a) : (b))
  14. #endif
  15.  
  16. #include "../iaca-win64/iacaMarks.h"
  17.  
  18. #define avx 1
  19. #define IACA_MARKS_OFF
  20.  
  21. typedef uint32_t PixelType2;
  22. typedef uint16_t PixelType;
  23.  
  24. __inline __m256i _mm256_loadu2_m128i(__m128i *low, __m128i *high)
  25. {
  26.     return _mm256_inserti128_si256(_mm256_castsi128_si256(_mm_loadu_si128((__m128i*)low)),
  27.                                                           _mm_loadu_si128((__m128i*)high),1);
  28.  
  29. }
  30.  
  31. void ToPixels_orig(uint8_t *pDst8, int nDstPitch, const uint8_t *pSrc8, int nSrcPitch, int nWidth, int nHeight, int bitsPerSample)
  32. {
  33.     int pixelMax = (1 << bitsPerSample) - 1;
  34.  
  35.     for (int h=0; h<nHeight; h++)
  36.     {
  37.         const PixelType2 *pSrc = (const PixelType2 *)pSrc8;
  38.         PixelType *pDst = (PixelType *)pDst8;
  39.         for (int i=0; i<nWidth; i++)
  40.         {
  41.             int a = (pSrc[i] + 16)>>5;
  42.             if (sizeof(PixelType) == 1)
  43.                 pDst[i] = a | ((255-a) >> (sizeof(int)*8-1));
  44.             else
  45.                 pDst[i] = min(pixelMax, a);
  46.         }
  47.         pDst8 += nDstPitch;
  48.         pSrc8 += nSrcPitch;
  49.     }
  50. }
  51.  
  52. void ToPixels_AVX2_16bit(uint8_t *pDst8, int nDstPitch, const uint8_t *pSrc8, int nSrcPitch, int nWidth, int nHeight, int bitsPerSample)
  53. {
  54.     static __m256i const sixteen  = _mm256_set1_epi32(16);
  55.     static __m128i const five     = _mm_set1_epi64x(5);
  56.     for (int h=0; h<nHeight; h++)
  57.     {
  58.         const uint32_t *pSrc = (const uint32_t *)pSrc8;
  59.         uint16_t *pDst = (uint16_t *)pDst8;
  60.  
  61.         nWidth_16 = (nWidth & ~15);
  62.         for (int i = 0; i < nWidth_16; i += 16)
  63.         {
  64.             __m256i src_1 = _mm256_loadu2_m128i((__m128i* )(pSrc + i), (__m128i* )(pSrc + i + 8));
  65.             __m256i src_2 = _mm256_loadu2_m128i((__m128i* )(pSrc + i + 4), (__m128i* )(pSrc + i + 12));
  66.  
  67.             __m256i a1 = _mm256_srl_epi32(_mm256_add_epi32(src_1, sixteen), five);
  68.             __m256i a2 = _mm256_srl_epi32(_mm256_add_epi32(src_2, sixteen), five);
  69.             _mm256_storeu_si256((__m256i* )(pDst + i), _mm256_packus_epi32(a1, a2));
  70.  
  71.         }
  72.  
  73.         for (int i = nWidth_16; nWidth_16 < nWidth; i++)
  74.         {
  75.             int a = (pSrc[i] + 16)>>5;
  76.             pDst[i] = min(pixelMax, a);
  77.         }
  78.         pDst8 += nDstPitch;
  79.         pSrc8 += nSrcPitch;
  80.     }
  81. }
  82.  
  83. void ToPixels_SSE2_16bit(uint8_t *pDst8, int nDstPitch, const uint8_t *pSrc8, int nSrcPitch, int nWidth, int nHeight, int bitsPerSample)
  84. {
  85.     static __m128i const sixteen  = _mm_set1_epi32(16);
  86.     static __m128i const five     = _mm_set1_epi64x(5);
  87.     for (int h=0; h<nHeight; h++)
  88.     {
  89.         const uint32_t *pSrc = (const uint32_t *)pSrc8;
  90.         uint16_t *pDst = (uint16_t *)pDst8;
  91.  
  92.         nWidth_8 = (nWidth & ~7);
  93.         for (int i = 0; i < nWidth_8; i += 8)
  94.         {
  95.             __m128i src_1 = _mm_lddqu_si128((__m128i* )(pSrc + i));
  96.             __m128i src_2 = _mm_lddqu_si128((__m128i* )(pSrc + i + 4));
  97.  
  98.             __m128i a1 = _mm_srl_epi32(_mm_add_epi32(src_1, sixteen), five);
  99.             __m128i a2 = _mm_srl_epi32(_mm_add_epi32(src_2, sixteen), five);
  100.             _mm_storeu_si128((__m128i* )(pDst + i), _mm_packus_epi32(a1, a2));
  101.         }
  102.  
  103.         for (int i = nWidth_8; nWidth_8 < nWidth; i++)
  104.         {
  105.             int a = (pSrc[i] + 16)>>5;
  106.             pDst[i] = min(pixelMax, a);
  107.         }
  108.         pDst8 += nDstPitch;
  109.         pSrc8 += nSrcPitch;
  110.     }
  111. }
  112.  
  113. uint64_t const MAX = 4294967296;
  114. uint32_t const BATCH = 65536;
  115. uint8_t const ITER = 10;
  116.  
  117. using namespace std;
  118.  
  119. int main()
  120. {
  121.     uint32_t *src = new uint32_t[BATCH];
  122.     uint16_t *dst = new uint16_t[BATCH];
  123.     uint16_t *sse = new uint16_t[BATCH];
  124.     uint64_t tot_c = 0, tot_avx = 0, tot_sse = 0;
  125.     uint64_t start, end;
  126.     for(uint8_t j = 0; j < ITER; j++)
  127.     {
  128.         for(uint32_t iter = 0; iter < BATCH; iter++)
  129.         {
  130.             for(uint64_t i = 0; i < BATCH; i++)
  131.                 src[i] = BATCH * iter + i;
  132.  
  133.             start = __rdtsc();
  134.             ToPixels_orig((uint8_t*)dst, BATCH, (uint8_t*)src, BATCH, BATCH, 1, 16);
  135.             end = __rdtsc();
  136.             tot_c += end - start;
  137.  
  138.             start = __rdtsc();
  139.             ToPixels_SSE2_16bit((uint8_t*)sse, BATCH, (uint8_t*)src, BATCH, BATCH, 1, 16);
  140.             end = __rdtsc();
  141.             tot_sse += end - start;
  142.  
  143.             start = __rdtsc();
  144.             ToPixels_AVX2_16bit((uint8_t*)sse, BATCH, (uint8_t*)src, BATCH, BATCH, 1, 16);
  145.             end = __rdtsc();
  146.             tot_avx += end - start;
  147.  
  148.         }
  149.  
  150.         printf("cicli c  : %20llu\n"
  151.                "cicli avx: %20llu\n"
  152.                "cicli sse: %20llu\n"
  153.                "diffenza c/avx: %f\n"
  154.                "diffenza c/sse: %f\n"
  155.                "diffenza sse/avx: %f\n", tot_c, tot_avx, tot_sse, (float)tot_c/(float)tot_avx, (float)tot_c/(float)tot_sse, (float)tot_sse/(float)tot_avx);
  156.  
  157.  
  158.     }
  159.         system("pause");
  160.  
  161.     return 0;
  162. }
  163.  
  164.  -O2 -march=core-avx2
  165.  cicli c  :          16069028936
  166. cicli avx:           3479067731
  167. cicli sse:           3952420122
  168. diffenza c/avx: 4.618774
  169. diffenza c/sse: 4.065618
  170. diffenza sse/avx: 1.136057
  171. cicli c  :          36326105778
  172. cicli avx:           7875570050
  173. cicli sse:           8945499109
  174. diffenza c/avx: 4.612505
  175. diffenza c/sse: 4.060825
  176. diffenza sse/avx: 1.135854
  177. cicli c  :          53213062764
  178. cicli avx:          11534067363
  179. cicli sse:          13100670525
  180. diffenza c/avx: 4.613555
  181. diffenza c/sse: 4.061858
  182. diffenza sse/avx: 1.135824
  183. cicli c  :          67941010573
  184. cicli avx:          14727013850
  185. cicli sse:          16725254304
  186. diffenza c/avx: 4.613360
  187. diffenza c/sse: 4.062181
  188. diffenza sse/avx: 1.135685
  189. cicli c  :          89191667408
  190. cicli avx:          19335612709
  191. cicli sse:          21957883495
  192. diffenza c/avx: 4.612818
  193. diffenza c/sse: 4.061943
  194. diffenza sse/avx: 1.135619
  195. cicli c  :         109229600089
  196. cicli avx:          23575137811
  197. cicli sse:          26813487597
  198. diffenza c/avx: 4.633254
  199. diffenza c/sse: 4.073681
  200. diffenza sse/avx: 1.137363
  201. cicli c  :         122392466376
  202. cicli avx:          26355151378
  203. cicli sse:          29993017323
  204. diffenza c/avx: 4.643968
  205. diffenza c/sse: 4.080699
  206. diffenza sse/avx: 1.138032
  207. cicli c  :         139711839407
  208. cicli avx:          30032840475
  209. cicli sse:          34210571303
  210. diffenza c/avx: 4.651969
  211. diffenza c/sse: 4.083879
  212. diffenza sse/avx: 1.139105
  213. cicli c  :         154549375786
  214. cicli avx:          33205606096
  215. cicli sse:          37834240435
  216. diffenza c/avx: 4.654315
  217. diffenza c/sse: 4.084908
  218. diffenza sse/avx: 1.139393
  219. cicli c  :         167509109185
  220. cicli avx:          36013172486
  221. cicli sse:          41023592505
  222. diffenza c/avx: 4.651329
  223. diffenza c/sse: 4.083239
  224. diffenza sse/avx: 1.139127
  225.  
  226. -O3 -march=core-avx2
  227. cicli c  :           6871242081
  228. cicli avx:           5664816544
  229. cicli sse:           6254182296
  230. diffenza c/avx: 1.212968
  231. diffenza c/sse: 1.098664
  232. diffenza sse/avx: 1.104040
  233. cicli c  :          12683725691
  234. cicli avx:          10469204071
  235. cicli sse:          11560038037
  236. diffenza c/avx: 1.211527
  237. diffenza c/sse: 1.097204
  238. diffenza sse/avx: 1.104195
  239. cicli c  :          17847899606
  240. cicli avx:          14773516038
  241. cicli sse:          16374322201
  242. diffenza c/avx: 1.208101
  243. diffenza c/sse: 1.089993
  244. diffenza sse/avx: 1.108356
  245. cicli c  :          23062613551
  246. cicli avx:          19120545569
  247. cicli sse:          21234215418
  248. diffenza c/avx: 1.206169
  249. diffenza c/sse: 1.086106
  250. diffenza sse/avx: 1.110544
  251. cicli c  :          27206401088
  252. cicli avx:          22573441790
  253. cicli sse:          25082508148
  254. diffenza c/avx: 1.205239
  255. diffenza c/sse: 1.084676
  256. diffenza sse/avx: 1.111151
  257. cicli c  :          31937676651
  258. cicli avx:          26493333877
  259. cicli sse:          29447055320
  260. diffenza c/avx: 1.205499
  261. diffenza c/sse: 1.084580
  262. diffenza sse/avx: 1.111489
  263. cicli c  :          37115015173
  264. cicli avx:          30810575815
  265. cicli sse:          34294225401
  266. diffenza c/avx: 1.204619
  267. diffenza c/sse: 1.082253
  268. diffenza sse/avx: 1.113067
  269. cicli c  :          41459165763
  270. cicli avx:          34391557986
  271. cicli sse:          38270611514
  272. diffenza c/avx: 1.205504
  273. diffenza c/sse: 1.083316
  274. diffenza sse/avx: 1.112791
  275. cicli c  :          47518820008
  276. cicli avx:          39417068102
  277. cicli sse:          43835101728
  278. diffenza c/avx: 1.205539
  279. diffenza c/sse: 1.084036
  280. diffenza sse/avx: 1.112084
  281. cicli c  :          53266037373
  282. cicli avx:          44166766473
  283. cicli sse:          49077206995
  284. diffenza c/avx: 1.206021
  285. diffenza c/sse: 1.085352
  286. diffenza sse/avx: 1.111180
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement