我希望运行一种需要生成随机数的monte carlo模拟,以及一组基于这些随机数的指令。
我希望使用并行处理,但在测试我的代码(用C语言编写)时,似乎有更多内核的反向加速!我不确定我做错了什么。然后我复制了代码形式another answer并仍然得到了这种效果。
从答案中稍加修改的代码是
#define NRANDS 1000000
int main() {
int a[NRANDS];
#pragma omp parallel default(none) shared(a)
{
int i;
unsigned int myseed = omp_get_thread_num();
#pragma omp for
for(i=0; i<NRANDS; i++)
a[i] = rand_r(&myseed);
}
double sum = 0.;
for (long int i=0; i<NRANDS; i++) {
sum += a[i];
}
printf("sum = %lf\n", sum);
return 0;
}
然后我在终端中运行time
命令,以便计算运行所需的时间。我使用export OMP_NUM_THREADS=2
改变了允许的线程数。我终端的输出是:
Thread total: 1
sum = 1074808568711883.000000
real 0m0,041s
user 0m0,036s
sys 0m0,004s
Thread total: 2
sum = 1074093295878604.000000
real 0m0,037s
user 0m0,058s
sys 0m0,008s
Thread total: 3
sum = 1073700114076905.000000
real 0m0,032s
user 0m0,061s
sys 0m0,010s
Thread total: 4
sum = 1073422298606608.000000
real 0m0,035s
user 0m0,074s
sys 0m0,024s
答案 0 :(得分:2)
请注意time
命令adds up the time spent on all cores打印user
和sys
值时。观察您的墙上时间(real
)几乎不变。
此外,您的基准太小了。创建和管理线程的成本很高。这种开销可能会使随机数生成的实际执行时间蒙上阴影。百万的价值并不是那么多。换句话说,实际计算随机数所花费的时间非常小,以至于它在噪音中丢失了,而且与设置/拆卸成本相比相形见绌。如果你生成更多,你可能会开始看到由于并行性的优势。