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;
}
答案 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 ++编译器代码生成选项。