我正在使用C++11中的新随机数生成器。虽然存在不同的意见,但从这个线程中可以看出大多数人认为它们不是线程安全的。因此,我想编写一个程序,使每个线程都使用自己的RNG。
在相关讨论中给出了一个使用OpenMP实现此目标的示例:
当我运行这个程序的多线程和单线程版本并跟踪时间时,它们在执行后完成所需的时间相同。此外,在这两种情况下,
问题:提供的示例是否正确地显示了如何强制每个线程使用自己的 RNG?如果不是,能否给出一个示例说明如何实现,或者提供一个解释如何实现这一点的参考资料?
在相关讨论中给出了一个使用OpenMP实现此目标的示例:
#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"
using namespace std;
int main()
{
unsigned long long app = 0;
{
//mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
mt19937_64 engine; //USE FOR SINGLE THREAD
uniform_real_distribution<double> zeroToOne(0.0, 1.0);
//#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
for (unsigned long long i = 0; i < 2000000000; i++)
{
if(zeroToOne(engine) < 0.5) app++;
}
}
cout << app << endl;
return 0;
}
当我运行这个程序的多线程和单线程版本并跟踪时间时,它们在执行后完成所需的时间相同。此外,在这两种情况下,
app
的大小不同,但我怀疑这仅仅是由于不同的种子造成的。问题:提供的示例是否正确地显示了如何强制每个线程使用自己的 RNG?如果不是,能否给出一个示例说明如何实现,或者提供一个解释如何实现这一点的参考资料?
: engines()
吗?严格来说,这是必需的吗?...(2) 我能否在程序的后续循环中使用对象rand
,而该循环未并行化? - BillyJeanomp_get_thread_num()
对于非并行化区域返回0,所以是的。 - hansmaad