【发布时间】:2015-10-19 23:39:33
【问题描述】:
我在我的项目中使用 MATLAB 已经有一段时间了,但我几乎从未有过 C++ 方面的经验。
我需要速度,我听说 C++ 可以比 MATLAB 更高效、更快。所以我尝试了这个:
我在 MATLAB 上使用 rand(5000,5000) 创建了一个随机数矩阵。
在 C++ 中,我初始化了一个 2D 向量,创建了 2 个 for 循环,每个循环循环 5000 次,每次循环。 MATLAB 快 4-5 倍,所以我认为这是因为 matlab 并行执行矢量化代码,然后我使用 parallel_for 编写了 C++ 代码。代码如下:
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <ppl.h>
using namespace std;
using namespace concurrency;
int main();
{
int a = 5000, b = 5000, j, k;
vector< vector<int> > vec(a, vector<imt>(b));
parallel_for(int(0), a, [&](int i) {
for (j = 0; j <b; j++)
{
vec[i][j] = rand();
}
});
}
所以上面的代码比 MATLAB 的 rand(5000,5000) 快大约 25%,但 C++ 使用 100% 的 CPU,而 MATLAB 使用 30% 的 CPU。
所以我通过使用rand(5000,5000) 运行 3 个 MATLAB 实例来强制 MATLAB 使用所有 CPU,并将所用时间除以 3。它使 MATLAB 的速度是 C++ 的两倍。
我想知道我错过了什么?我知道这是一个小例子,但我需要一个答案才能确保将我的代码移植到 C++。
当前状态:
当我在没有parallel_for 的情况下编写 C++ 代码时,在 CPU 使用率相同的情况下,我得到了 MATLAB 一半的速度。然而,给出答案的人说他们几乎是一样的。我不明白我错过了什么
【问题讨论】:
-
可能不相关,只是好奇:您是否尝试过使用大小为 25000 的一维向量,然后在执行过程中将其伪装成二维?
-
我需要一个答案才能确保将我的代码移植到 C++ 停止!别。 Matlab 的大多数核心计算例程已经用 C++(或另一种编译语言)编写,并且性能优于您自己编写的任何程序。其中许多已经是多线程的,如果你想编写更快的 C++,你也必须这样做。这里有很多关于 SO 的问题和答案与(通常)无用地追求编写比 Matlab 更快的代码有关。
-
他说 我已经使用 Matlab 和 C++ 大约 10 年了,而你承认 我几乎从来没有使用过 C++。 这是一部分我的论点——你(或我)可能需要 10 年的 C++ 才能为 Matlab 提供的核心计算例程编写更快的代码。但这取决于你。
-
您可能对Armadillo 库感兴趣。
-
(1) rand() 很烂。 (2) 我假设 C
rand()锁定了全局 RNG 状态,这会破坏您的并行性。给每个线程它自己的 random_device。另见stackoverflow.com/questions/7217791/random-numbers-in-c0x
标签: c++ performance matlab