如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
普通版的要29ms左右,avx2版本的居然<1ms
不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
不过我没开优化,不知道是不是算坐标的乘法拖累了
///////////////////////////////////// normal
for (int h = 0; h < size.h; ++h)
{
for (int w = 0; w < size.w; ++w)
buffer[size.w*h+w] = chromaMap[grayscaleBuffer[size.w*h + w]];
}
///////////////////////////////////// simd
for (int h = 0; h < size.h; ++h)
{
for (int w = 0; w < size.w; w += 8)
{
__m256i avx_grayscale = _mm256_cvtepu8_epi32(_mm_loadl_epi64((__m128i*)(grayscaleBuffer.data() + size.w*h + w)));
__m256i* out = (__m256i*)(bufferSimd.data() + size.w*h+w);
_mm256_store_si256(out, _mm256_i32gather_epi32((int*)chromaMap, avx_grayscale, sizeof(uint32_t)));
}
}
assert(bufferSimd == buffer);
--
修改:libgcc FROM 171.82.99.*
FROM 171.82.99.*