首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环由于“1300”原因未向量化

循环由于“1300”原因未向量化
EN

Stack Overflow用户
提问于 2016-05-20 13:55:15
回答 2查看 624关注 0票数 4

我正在尝试向量化一个循环,该循环需要进行大量的迭代(超过30万000次)以获得一些计算时间:

代码语言:javascript
复制
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个理由是:

循环体不包含--或很少--计算。

事实上,我的循环体计算非常少,但是由于有大量的迭代,所以仍然需要一些时间。

为什么在这种情况下没有进行矢量化呢?是因为这不值得吗?如果是,为什么?

如果没有,是否有任何“强迫”的方法或手段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-20 14:00:52

基本上,循环的主体是如此简单,因此按原样编译它比将其向量化更有效率,因为矢量化的运行时成本将比执行代码的成本高。

试图强迫它是没有意义的,因为编译器告诉您,向量化版本比非向量化版本的效率要低。如果将更多的计算添加到循环中,编译器可能会选择将其向量化。

票数 3
EN

Stack Overflow用户

发布于 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位文本。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37348557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档