使用英特尔TBB填充随机数字阵列

时间:2013-04-29 22:12:18

标签: c++ random c++11 parallel-processing tbb

我有两个不同的函数用随机数填充全局数组:使用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%的加速度。这与随机功能有关吗?有没有办法避免这种情况?

1 个答案:

答案 0 :(得分:1)

是的,你正在调用函数而不是执行乘法指令。每次调用该函数时,都必须设置调用帧,跳转到函数,计算随机数并从函数返回。添加堆栈操作,堆栈检查等等,它会变慢。关于避免它的唯一方法是提供自己的random实现,并希望它可以被编译器内联。