首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止C++矢量化的数学函数

防止C++矢量化的数学函数
EN

Stack Overflow用户
提问于 2020-09-17 07:38:07
回答 1查看 217关注 0票数 0

我有如下所示的代码,并希望将其矢量化。我用一个情报顾问分析了整个代码。它说我不能把它矢量化,因为它里面有数学函数。当然,它指出了循环中使用的sin和cos函数。

如何在不使用英特尔短向量数学库的情况下矢量化这个循环?

代码:

代码语言:javascript
运行
复制
for (size_t j = 0; j < NA; ++j) {
    esf = sfs[j];
    x = p_data[3 * j];
    y = p_data[3 * j + 1];
    z = p_data[3 * j + 2];

    p = x * qx + y * qy + z * qz;

    Ar += esf * cos(p);
    Ai += esf * sin(p);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-17 07:58:20

,它说我不能把它矢量化,因为里面有数学函数。

实际上,阻止矢量化的是Ar +=Ai +=术语,因为这意味着j = 2的输出将取决于j = 1的输出。如果ArAi只是输出,则可以将它们改为数组,并在运行循环后对它们进行求和。

代码语言:javascript
运行
复制
// init to 0
double Ar_elem[NA] = {0.0};
double Ai_elem[NA] = {0.0};

for (size_t j = 0; j < NA; ++j) {
    esf = sfs[j];
    x = p_data[3 * j];
    y = p_data[3 * j + 1];
    z = p_data[3 * j + 2];

    p = x * qx + y * qy + z * qz;

    Ar_elem[j] = esf * cos(p);
    Ai_elem[j] = esf * sin(p);
}

//sum
double Ar = std::accumulate(begin(Ar_elem), end(Ar_elem), 0, plus<double>());
double Ai = std::accumulate(begin(Ai_elem), end(Ai_elem), 0, plus<double>());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63933350

复制
相关文章

相似问题

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