我有两个不同的函数来用随机数填充全局数组:使用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%的速度。这与随机函数有关吗?有办法避免这种情况吗? 最佳答案
是的,您正在调用一个函数而不是执行一个乘法指令。每次调用该函数时,都必须设置调用框架,跳转到该函数,计算随机数并从该函数返回。添加堆栈操作,堆栈检查等,它将变得更慢。避免这种情况的唯一方法是提供自己的random
实现,并希望编译器可以内联它。
关于c++ - 使用Intel TBB用随机数填充数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16289110/