C++ VisualStudioStd::复杂性能
我在使用std::complex时遇到性能问题。我正在开发AMD架构,Visual Studio 2013 64位,发布模式 当我使用内置的复数运算符*时,这段代码的运行时间大于92毫秒(我对它进行了简化,但这是一个循环,我对结果进行了平均)。如果我使用我在下面注释掉的代码,它本质上是一个手工编码的复数乘法版本,它将在大约6毫秒内运行。复数是基本的构造块,作为科学计算的开发人员,我每天都在使用它们,所以我认为性能会比这个好得多。一般来说,我不能对矩阵作任何假设。没有特别的对称性,它们也不总是正方形。有人经历过吗?我不愿意使用我自己的手工编码方法。无论我使用的是人工编码的复数乘法还是库中的复数乘法,我都使用相同的编译选项。也许操作不是内联的C++ VisualStudioStd::复杂性能,c++,C++,我在使用std::complex时遇到性能问题。我正在开发AMD架构,Visual Studio 2013 64位,发布模式 当我使用内置的复数运算符*时,这段代码的运行时间大于92毫秒(我对它进行了简化,但这是一个循环,我对结果进行了平均)。如果我使用我在下面注释掉的代码,它本质上是一个手工编码的复数乘法版本,它将在大约6毫秒内运行。复数是基本的构造块,作为科学计算的开发人员,我每天都在使用它们,所以我认为性能会比这个好得多。一般来说,我不能对矩阵作任何假设。没有特别的对称性,它们也不总是正方
#include <iostream>
#include <complex>
#include <vector>
#include <thread>
#include <Windows.h>
using namespace std;
int main()
{
const int M = 150;
const int N = 150;
const int K = 150;
vector<complex<float>> v1(M*N);
vector<complex<float>> v2(N*K);
vector<complex<float>> v3(M*K);
for (int k = 0; k < M*N; ++k)
{
v1[k] = complex<float>(float(k), float(k));
}
for (int k = 0; k < N*K; ++k)
{
v2[k] = complex<float>(float(k), float(k));
}
LARGE_INTEGER frequency, start_time, end_time;
QueryPerformanceFrequency(&frequency);
QueryPerformanceCounter(&start_time);
for (int i = 0; i < M; ++i)
{
for (int k = 0; k < K; ++k)
{
complex<float> sum(0.0f, 0.0f);
for (int j = 0; j < N; ++j)
{
int idx1 = i*N + j;
int idx2 = k*N + j;
sum += v1[idx1] * v2[idx2];
//float re = v1[idx1].real() * v2[idx2].real() -
// v1[idx1].imag()*v2[idx2].imag();
//float im = v1[idx1].real()*v2[idx2].imag() +
// v1[idx1].imag()*v2[idx2].real();
//sum.real(sum.real() + re);
//sum.imag(sum.imag() + im);
}
v3[i*K + k] = sum;
}
}
QueryPerformanceCounter(&end_time);
LARGE_INTEGER elapsed_us;
elapsed_us.QuadPart = (end_time.QuadPart - start_time.QuadPart) * 1000000 / frequency.QuadPart;
cout << "Total time in microseconds = " << elapsed_us.QuadPart << endl;
this_thread::sleep_for(chrono::seconds(5));
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
常数int M=150;
常数int N=150;
常数int K=150;
向量v1(M*N);
向量v2(N*K);
向量v3(M*K);
对于(int k=0;k coutGCC也有同样的问题,除非您使用-O3-ffast math进行编译。ICC似乎根据(比较复数和浮点之间的基准测试)存在问题
我更喜欢mandelbrot集合演示中的手写浮点算法,不使用std::complex。但对于现实世界中的问题,我没有答案。哦,我以前见过这个问题,但我现在找不到副本,IIRC它只是VS,在优化它方面很差劲。如果我找到它,我会在这里发布。谢谢。我尝试了基本的搜索,但我可以我找不到任何有用的东西。我非常确信我必须启用一个设置或其他东西。不幸的是,标准委员会不能指定性能。我理解他们为什么不能,这很烦人。我想我会查看他们的头文件,看看我能找到什么。是什么让性能如此糟糕?也许我可以打开一个defect报告?哦,天哪,这不是一个骗局,所以,我看到了类似的东西