Armadillo + OpenBLAS比MATLAB慢?

时间:2014-04-25 18:06:31

标签: c++ blas armadillo

SO的新手。我正在测试Armadillo + OpenBLAS,简单的蒙特卡罗几何布朗运动逻辑显示比MATLAB更长的运行时间。我相信一定是错的。

环境: 英特尔i-5 4核心, 8GB内存, VS 2012 Express, 犰狳4.2, OpenBLAS(官方x64二进制文件)v0.2.9.rc2,

对于相同的逻辑,MATLAB需要2秒,但Armadillo + OB需要12秒。我还注意到该程序在单线程上运行,但我转向OpenBLAS,因为我听说它的多核功能。

感谢您的任何建议。

#include <iostream>
#include <armadillo>
#include <ctime>

using namespace std;
using namespace arma;

int main()
{
clock_t start;
start = clock();
unsigned int R=100000;
vec Spre = 100*ones<vec> (R);
vec S = zeros<vec> (R);
double r = 0.03;
double Vol = 0.2;
double TTM = 5;
unsigned int T=260*TTM;
double dt = TTM/T;
for (unsigned int iT=0; iT<T; ++iT)
{
    S = Spre%exp((r-0.5*Vol*Vol)*dt + Vol*sqrt(dt)*randn(R));
    Spre = S;
}
cout << mean(S) << endl;
cout << (clock()-start) / (double) CLOCKS_PER_SEC << endl;
system("pause");
return 0;
}

4 个答案:

答案 0 :(得分:3)

首先,瓶颈不是exp(),尽管std :: exp很慢。问题是randn()。

在我的机器上,randn()占用了大部分时间。当我使用MKL_VSL实现randn时,时间成本从12s降至4s,与matlab的3s左右相当。

class Author(models.Model):
    salutation = models.CharField(max_length=10)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return self.first_name


class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=100)
    website = models.URLField()

    def __str__(self):
        return '    %s  ---->  %s' % (self.name, self.address)


class Book(models.Model):
    title = models.CharField(max_length=30)
    publication_date = models.DateField()
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)

    def __str__(self):
        return self.title

答案 1 :(得分:2)

关键观察是Armadillo exp()函数比MATLAB慢。 在log(),pow()和sqrt()中观察到类似的开销。

答案 2 :(得分:0)

只是一个猜测,但看起来你需要通过OPENBLAS_NUM_THREADS环境变量设置在OpenBLAS中使用的线程数。

尝试类似:

set OPENBLAS_NUM_THREADS=4

...在运行程序之前在命令行上运行。替换系统中我放置“4”的核心数(有人会说它设置为系统核心数的两倍 - YMMV)。

答案 3 :(得分:0)

确保在编译代码时启用了Streaming SIMD Extensions。在Visual Studio中,检查项目C / C ++编译器代码生成选项。