在 C++ 中阻止矢量化的数学函数
Math function preventing vectorization in C++
我有如下代码,我想对其进行矢量化处理。
我使用英特尔顾问分析了整个代码。
它说我不能向量化它,因为它有数学函数。
它当然指出了循环内使用的 sin 和 cos 函数。
如何在不使用英特尔短向量数学库的情况下对该循环进行向量化?
代码:
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);
}
It says I cant vectorize this because it has math functions in it.
实际上是 Ar +=
和 Ai +=
项阻止了向量化,因为这意味着 j = 2
的输出将取决于 j = 1
的输出。如果 Ar
和 Ai
只是输出,您可以将它们改为数组,并在 运行 循环后对它们求和。
// 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>());
我有如下代码,我想对其进行矢量化处理。 我使用英特尔顾问分析了整个代码。 它说我不能向量化它,因为它有数学函数。 它当然指出了循环内使用的 sin 和 cos 函数。
如何在不使用英特尔短向量数学库的情况下对该循环进行向量化?
代码:
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);
}
It says I cant vectorize this because it has math functions in it.
实际上是 Ar +=
和 Ai +=
项阻止了向量化,因为这意味着 j = 2
的输出将取决于 j = 1
的输出。如果 Ar
和 Ai
只是输出,您可以将它们改为数组,并在 运行 循环后对它们求和。
// 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>());