- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在使用 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/
我有一个使用 c++ 的大型代码库标题和许多std::complex对象。但现在我还想使用其他几个使用 fftw 的库( spinsfast 和 ) .不幸的是,混合这两种类型的复合体似乎与 gc
我是 Maxima 的新手,在文档中找不到如何对复数进行正式计算。当我使用未指定的变量时,Maxima 似乎假设它们是真实的: 例如,共轭(x)返回 x。 有没有办法解决这个问题? 提前致谢。 最佳答
我是学习大O表示法的新手,并想到了这个问题。复杂度 O(a * b) 的名称是什么?是线性复杂度吗?多项式?或者是其他东西。实现代码如下。 function twoInputsMult(a, b) {
我是学习大O表示法的新手,并想到了这个问题。复杂度 O(a * b) 的名称是什么?是线性复杂度吗?多项式?或者是其他东西。实现代码如下。 function twoInputsMult(a, b) {
这是我的 Complex 类,我重载了“+” class Complex(object): def __init__(self, real, imag): self.__ima
我正在使用 R5RS 标准的 Scheme 实现。 现在假设您必须找出一个元素 '(2 3 4) 是否在列表 '(1 2 3 4) 中。 至于示例,更严格地说,您希望: 1. (is-in? '(2
注意事项: 我正在使用 Apple LLVM 版本 6.0 (clang-600.0.56)(基于 LLVM 3.5svn)在 OSX 上编译 具体来说,我正在尝试从 LibIIR 编译一个整体源,这
这段fortran代码最初是用Fortran 77格式编写的(我稍后会展示它)。拿到后,我通过转换工具将其转换为f90免费格式。使用intel fortran编译器 ifort,编译和运行和以前一样好
我有一个实现用户定义的算术类型的MyType类。此类提供以下转换运算符 struct MyType { ... operator double() { return to_double
我目前正在使用 Cxx 来允许 Julia 代码与 C++ 库交互。我想做的一部分是在两个方向上有效地传递复杂数据的集合(通常是 vector )。也就是说,我想要以下内容: cv = [1 + 2i
假设我有一个名为“汽车”的实体。 我使用复杂类型来定义“引擎”部分。 [TableName("T_CAR")] public sealed class Car:IEngine { ... pu
我想使用 static_cast 将 complex 转换为 complex 。 Convert complex to complex 我正在尝试做与这篇文章相同的事情,但我需要使用 static_c
` ?
对于多项式方程求解器,最好将其模板化为任何可用类型: template class PolynomialEquation { public: private: array myEquatio
为了在 cython 中将实部与复部分开,我通常使用 complex.real 和 complex.imag 来完成这项工作。然而,这确实会在 html 输出中生成颜色为“python red”的代码
我的问题很简单: Are both "complex float" and "float complex" valid C? 两者似乎都被 gcc 接受而没有警告。 最佳答案 complex 是 co
以下声明有什么区别? 结构体 *ptr1=(结构体*)malloc(4*sizeof(结构体)); 结构体 (*ptr1)[4]=(结构体*)malloc(sizeof(结构体)); 哪个更好用? 最
我想创建一个 C++ 类的复数。这里是Complex.h(最基本的形式) #ifndef _COMPLEX #define _COMPLEX #include "TVector2.h" class C
我已经使用 Visual Studio 2012 和 NDepend 对我的解决方案进行了代码分析 对于方法 MethodA,Visual Studio 显示复杂度为 105,Ndepend 显示为
我的代码: #include using std::cin; using std::cout; using std::istream; using std::ostream; template cl
我在 swift3 中有以下代码,我正在使用 swift lint 对代码进行 linting。给出代码如下: func selectedMenuInLoggedOutState(sender
我是一名优秀的程序员,十分优秀!