gpt4 book ai didi

c++ - Visual Studio std::complex 性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:37 24 4
gpt4 key购买 nike

我在使用 std::complex 时遇到性能问题。我正在开发 AMD 架构,Visual Studio 2013 64 位, Release模式。

当我使用内置的复杂运算符 * 时,此代码的运行时间 > 92 毫秒(我已对其进行了简化,但这是在一个循环中,并且我正在计算结果的平均值)。如果我使用我在下面注释掉的代码,它本质上是复数乘法的手动编码版本,它运行大约 6 毫秒。复数是基本的构建 block ,我作为科学计算的开发人员每天都在使用它们,所以我认为性能会比这好得多。一般来说,我不能对矩阵做任何假设。没有特殊的对称性,它们也不总是正方形。有没有人经历过这个?我不愿意诉诸于使用我自己的手工编码方法。无论我使用复数乘法的手动编码版本还是库中的版本,我都使用相同的选项进行编译。也许操作不是内联的??

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

命令行选项如下:

/GS/GL/W3/Gy/Zc:wchar_t/Zi/Gm-/O2/Fd"x64\Release\vc120.pdb"/fp:precise/D "WIN32"/D "NDEBUG"/D "_CONSOLE"/D "_LIB"/D "_UNICODE"/D "UNICODE"/errorReport:prompt/WX-/Zc:forScope/Gd/Oi/MD/Fa"x64\Release\"/EHsc/nologo/Fo"x64\Release\"/Fp"x64\Release\Matrix_Multiply_Test.pch"

最佳答案

GCC 也有同样的问题,除非你用-O3 -ffast-math 编译。根据 http://www.lomont.org/Math/Papers/2011/Intro%20to%20Intel%20AVX-Final.pdf,ICC 似乎有问题. (比较 Complex 和 Float 之间的基准)

对于我的 mandelbrot 集演示,我更喜欢手写浮点算法,而不使用 std::complex。但对于现实世界的问题,我没有答案。

关于c++ - Visual Studio std::complex 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com