C++ 使用“英特尔TBB”使用随机数填充数组
我有两个不同的函数用随机数填充全局数组:一个是串行版本,另一个是使用lamba表达式和TBB的并行版本C++ 使用“英特尔TBB”使用随机数填充数组,c++,random,c++11,parallel-processing,tbb,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_
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 ; });
}
void获取数据(void)
{
int j=0;
srand((无符号)时间(NULL));
cout是的,您正在调用函数而不是执行乘法指令。每次调用函数时,它都必须设置调用帧,跳转到函数,计算随机数并从函数返回。添加堆栈操作、堆栈检查等,速度会变慢。避免这种情况的唯一方法是提供自己实现的random
,希望它能被编译器内联。是的,您正在调用函数,而不是执行乘法指令。每次调用函数时,它都必须设置调用帧,跳转到函数,计算随机数并从函数返回。添加堆栈操作、堆栈检查,并且速度会慢一些。避免这种情况的唯一方法是提供自己的random
实现,并希望它能被编译器内联。并发调用rand
可能是个坏主意。如果实现是线程安全的,那么每次调用时它都必须锁定对内部状态的访问它将把你的并行程序变成一个顺序程序。如果它不是线程安全的,那么并行调用rand
只会产生垃圾。@JaredHoberock锁可以通过使用线程本地存储来消除。rand可能会序列化,如果你使用的是tbb,请看使用combinable和C++11随机数ge生成器来构建线程本地随机数生成器。并发调用rand
可能是个坏主意。如果实现是线程安全的,那么每次调用它时它都必须锁定对内部状态的访问,这只会将并行程序转为顺序程序。如果不是线程安全的,则调用rand
并行运行只会产生垃圾。@JaredHoberock使用线程本地存储可以消除锁定。如果使用tbb,请查看使用combinable和C++11随机数生成器来构建线程本地随机数生成器。实际上,指令管道(特别是分支预测器)将消除这些函数调用的大部分延迟(假设它们不是内联的-为什么rand()是不可内联的?)@MSalters如果在共享库中,指令管道(特别是分支预测器)将消除这些函数调用的大部分延迟(假设它们不是内联的-为什么rand()不可内联?)@MSalters如果在共享库中