我正在使用open mp编写一个并行程序,我在其中生成一个随机浮点数矩阵,然后对其进行大量计算.我目前想要生成并行运行矩阵的步骤,但我遇到的问题是rand()函数并不意味着并发运行.我不想使用锁来在rand上提供互斥,因为这是在循环中唯一做的事情,它可能只是更有效地顺序运行它.有没有办法有效地并行执行此步骤?
这里是这个部分的当前代码(在rand上有out mutex);
#pragma omp parallel default(private)
{
int i= omp_get_thread_num();
for(int j=0; j<cols; j++)
matrix[i][j]= rand()%1000 + (float)(rand()%100)/(float)(rand()%1000);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 C++,则应考虑使用Boost 库随机数类。您可以为每个线程创建一个唯一的 PRNG 实例。如果您需要可重复性,则可以使用可重复生成的种子值来初始化主线程中的每个实例。
更新:事实证明,在我写完这篇文章后,C++11 发布了,它包含了一个更现代的用于生成随机数的库。它包括std::uniform_int_distribution和std::std::uniform_real_distribution,两者都依赖于生成器,例如std::mersenne_twister_engine(或特定配置std::mt19937)。举个例子:
#include <random>
#include <iostream>
int main() {
std::mt19937 gen; // Uses default seed value to generate repeatable sequence
std::uniform_int_distribution<int> d20(1,20);
std::uniform_real_distribution<float> prob(0.0, 1.0);
std::cout << d20(gen) << std::endl;
std::cout << prob(gen) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)