【发布时间】:2019-05-08 23:34:49
【问题描述】:
为了加快库中的计算速度,我决定使用std::valarray 类。 documentation 说:
std::valarray 和 helper 类被定义为没有某些 形式的别名,从而允许对这些类进行操作 优化类似于C中关键字restrict的效果 编程语言。此外,函数和运算符采用 valarray 参数被允许返回代理对象来实现 编译器可以优化表达式,例如 v1 = a * v2 + v3;作为执行 v1[i] = a * v2[i] + v3[i] 的单个循环;避免任何临时或多次通过。
这正是我所需要的。当我使用 g++ 编译器时,它按照文档中的描述工作。我开发了一个简单的例子来测试std::valarray 的性能:
void check(std::valarray<float>& a)
{
for (int i = 0; i < a.size(); i++)
if (a[i] != 7)
std::cout << "Error" << std::endl;
}
int main()
{
const int N = 100000000;
std::valarray<float> a(1, N);
std::valarray<float> c(2, N);
std::valarray<float> b(3, N);
std::valarray<float> d(N);
auto start = std::chrono::system_clock::now();
d = a + b * c;
auto end = std::chrono::system_clock::now();
std::cout << "Valarr optimized case: "
<< (end - start).count() << std::endl;
check(d);
// Optimal single loop case
start = std::chrono::system_clock::now();
for (int i = 0; i < N; i++)
d[i] = a[i] + b[i] * c[i];
end = std::chrono::system_clock::now();
std::cout << "Optimal case: " << (end - start).count() << std::endl;
check(d);
return 0;
}
在 g++ 上我得到了:
Valarr optimized case: 1484215
Optimal case: 1472202
看来d = a + b * c;的所有操作真的都放在了一个周期内,在保持性能的同时简化了代码。但是,当我使用 Visual Studio 2015 时,这不起作用。对于相同的代码,我得到:
Valarr optimized case: 6652402
Optimal case: 1766699
相差几乎是四倍;没有优化!为什么 std::valarray 在 Visual Studio 2015 上无法正常工作?我做的一切都正确吗?如何在不放弃std::valarray的情况下解决问题?
【问题讨论】:
-
你是否在 VS2015 上进行了优化编译?
-
我在VS上使用Release平台,在g++上使用-O2优化
-
看看这个答案。 stackoverflow.com/a/6851413/11472661.
标签: c++ optimization valarray