- 246 名前:,,・´∀`・,,)っ-○○○ mailto:sage [2009/04/19(日) 01:17:51 ]
- 【続き】
virtual int population_count(unsigned int data[4]) { __m128i sum = population_count_sse_iter((__m128i *)data); return _mm_extract_epi16(sum, 4) + _mm_cvtsi128_si32(sum); } virtual int population_count_array(unsigned int data[][4],int size) { __m128i sum = _mm_setzero_si128(); for(int i=0;i<size;i++) { sum = _mm_add_epi32(sum, population_count_sse_iter((__m128i*)data[i])); } return _mm_cvtsi128_si32(sum) + _mm_cvtsi128_si32(_mm_srli_si128(sum, 4)); } んで、うちの環境ではこんな感じになった(Core 2 Duo E8500, Cygwin) func = reference : test=OK : clock = 8890 : sum = 504854834 func = bit32 : test=OK : clock = 4859 : sum = 504854834 func = bit64 : test=OK : clock = 12829 : sum = 504854834 func = sse : test=OK : clock = 2156 : sum = 504854834 func = dango-sse : test=OK : clock = 1281 : sum = 504854834 func = dango-ssse3 : test=OK : clock = 1093 : sum = 504854834 64bitが遅いのは32ビットとしてビルドしてるからだと思うが、それはさておき SSSE3を使う方法は、Penryn/Nehalemでは速いけど AtomとかCore 2 65nm系は使えてもSSE2のより遅い。
|

|