我正在尝试向量化一个循环,该循环需要进行大量的迭代(超过30万000次)以获得一些计算时间:
uint16_t* samples = (uint16_t*)pixmap->samples;
Image image(pixmap->w, pixmap->h);
uint8_t *dest = (uint8_t*)image[0];
for (int x = 0; x < len; x++)
{
dest[x] = samples[x] & 0xFF;
}但qvec报告称,由于1300年的原因,它无法被矢量化。
根据MSDN的说法,1300个理由是:
循环体不包含--或很少--计算。
事实上,我的循环体计算非常少,但是由于有大量的迭代,所以仍然需要一些时间。
为什么在这种情况下没有进行矢量化呢?是因为这不值得吗?如果是,为什么?
如果没有,是否有任何“强迫”的方法或手段?
发布于 2016-05-20 14:00:52
基本上,循环的主体是如此简单,因此按原样编译它比将其向量化更有效率,因为矢量化的运行时成本将比执行代码的成本高。
试图强迫它是没有意义的,因为编译器告诉您,向量化版本比非向量化版本的效率要低。如果将更多的计算添加到循环中,编译器可能会选择将其向量化。
发布于 2016-05-20 14:18:30
您可能混淆了自动向量器(SSE/AVX)和自动并行器(线程)。但这并不是真正的问题,我想:dest[x] = samples[x] & 0xFF的真正意思是dest[x] = static_cast<uint8_t>(static_cast<int>(samples[x]) & 0xFF)。在所有这些转换到不同宽度的情况下,很难找到等效的SSE代码。SSE2允许您在16x8或8x16位中组织128位寄存器,但在这里您可以混合8位和16位类型,以及32位文本。
https://stackoverflow.com/questions/37348557
复制相似问题