- 主题:avx快的有点不可思议
如下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.*
你这29ms也太慢了吧…
【 在 libgcc 的大作中提到: 】
: 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: 普通版的要29ms左右,avx2版本的居然<1ms
: 不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
: ...................
--
FROM 117.136.101.*
【 在 libgcc 的大作中提到: 】
: 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: 普通版的要29ms左右,avx2版本的居然<1ms
: 不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
: ...................
一般下标计算我都是用加法。肯定比乘法快。
而且你还做两次乘法。
--
修改:ylh1969 FROM 221.221.51.*
FROM 221.221.51.*
没开优化是debug?会不会operator[]有些额外检查
【 在 libgcc 的大作中提到: 】
: 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: 普通版的要29ms左右,avx2版本的居然<1ms
: 不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
: ...................
--
FROM 117.128.4.*
可以试试下面这个代码的速度。和你的普通版是等价的。我觉得不应该超过2ms.
uint32_t *pBuffer = buffer;
uint32_t *pBufferEnd = &buffer[size.w * size.h];
uint8_t *pGrayscaleBuffer = grayscaleBuffer;
while (pBuffer < pBufferEnd)
{
*pbuffer = chromaMap[*pGrayscaleBuffer];
++pbuffer;
++pGrayscaleBuffer;
}
【 在 libgcc 的大作中提到: 】
: 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: 普通版的要29ms左右,avx2版本的居然<1ms
: 不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
: ...................
--
FROM 120.244.156.*
要是没开优化做性能测试根本没意义
【 在 Akyrum 的大作中提到: 】
: 没开优化是debug?会不会operator[]有些额外检查
: 【 在 libgcc 的大作中提到: 】
: : 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: ...................
--
FROM 114.249.192.*
不开优化……
不开优化C++肯定比C慢不少。
开了优化大工程C++比C快。
你觉得不开优化的结果有意义吗?
【 在 libgcc 的大作中提到: 】
: 如下2段代码,就是从一个256的buffer里给一个800x800的indexarray,把灰度映射成后rgba彩色
: 普通版的要29ms左右,avx2版本的居然<1ms
: 不是最多只能快8倍么,怎么差这么多,而且确实填充的值是一样的
: ...................
--
FROM 76.126.252.*
size.w*h可以放到外层循环一次性求值。不过我估计GCC也能优化,但-O需要开到几就得试了。
--
FROM 171.221.29.*
膜拜大神,我更加坚定的认为自己不过是一个会写程序的分析师而已。
--
FROM 111.201.52.*