1

我有两个不同的函数来用随机数填充全局数组:串行版本和使用 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 ; });

}

该程序正在运行英特尔至强集群,但不幸的是并行版本要慢得多。如果不是用随机数填充数组,我只需做一个data[i] *= 2高达 50% 的速度就可以测量。这与随机函数有关吗?有没有办法避免这种情况?

4

1 回答 1

1

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

于 2013-04-29T22:30:38.380 回答