如何解决为什么旧的rand在openMP中比uniform_real_distribution快?
有人可以向我解释为什么使用旧rand()的第二个for循环比第一个循环执行得快得多吗?我在这里的多篇文章中看到,建议使用c ++ 11引擎和统一分发,因为rand()+多线程是性能瓶颈? 另外如建议的那样,我每个线程都有生成器和函数。
int main(int argc,char *argv[])
{
std::vector<mt19937> generators(omp_get_max_threads());
std::vector<uniform_real_distribution<double>> functions(omp_get_max_threads());
for (int i = 0; i < omp_get_max_threads(); i++)
{
// seed is random
generators[i] = mt19937(1654 + 17*i);
functions[i] = uniform_real_distribution<double>(0.0,1.0);
}
double itime = omp_get_wtime();
#pragma omp parallel for
for (int i =0; i < 10000000; i++)
{
int a = functions[omp_get_thread_num()](generators[omp_get_thread_num()]);
}
double end = omp_get_wtime() - itime;
srand(time(NULL));
double start = omp_get_wtime();
#pragma omp parallel for
for (int i =0; i < 10000000; i++)
{
int a = ((double) rand() / (RAND_MAX));
}
double endR = omp_get_wtime() - start;
cout << "Generator: " << end<<endl;
cout<<"Old: "<<endR << endl;
}
解决方法
评论暗示了这样的情况
struct alignas(std::hardware_destructive_interference_size) Rng {
std::mt19937 mers;
std::uniform_real_distribution<double>> dist;
};
std::vector<Rng> rngs(omp_get_max_threads());
我隐约记得,omp
可以为每个块设置一个值,因此omp_get_thread_num()
可以一直设置,这也可能使对每个结构Rng的引用成为可能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。