数学函数阻止C++中的矢量化

Math function preventing vectorization in C++

本文关键字:矢量化 C++ 函数      更新时间:2024-03-29

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

如何在不使用intel短矢量数学库的情况下对这个循环进行矢量化?

代码:

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);
}

它说我不能向量化它,因为它有数学函数。

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

// 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>());