我有两个不同的函数用随机数填充全局数组:使用lamba表达式和TBB的串行版本和并行版本。
void get_data(void)
{
int j = 0;
srand((unsigned) time(NULL));
cout << "Generating random numbers ...\n";
for (j = 0; j < DATASIZE; j++)
data[j] = (rand() % range) + range_min ;
}
void parallel_get_data(void)
{
int j = 0;
srand((unsigned) time(NULL));
parallel_for(0, DATASIZE, 1, [=](int i)
{ data[i] = (rand() % range) + range_min ; });
}
该程序正在运行Intel Xeon集群但不幸的是并行版本要慢得多。如果不是用随机数填充数组,我只需要data[i] *= 2
,可以测量高达50%的加速度。这与随机功能有关吗?有没有办法避免这种情况?
答案 0 :(得分:1)
是的,你正在调用函数而不是执行乘法指令。每次调用该函数时,都必须设置调用帧,跳转到函数,计算随机数并从函数返回。添加堆栈操作,堆栈检查等等,它会变慢。关于避免它的唯一方法是提供自己的random
实现,并希望它可以被编译器内联。