首页 > 解决方案 > 使用 OpenMP 和 drand48_r 优化功能

问题描述

我需要使用 openMp 优化以下 c++ 代码,并将随机数生成器替换为 drand48_r。

void MyClass::generateData()
{
   for (int i = 0; i < n; i++)
   {
      data_int[i] = MyRandomClass->getInt();
      data_int_help[i] = MyRandomClass->getInt();
      data_double[i] = MyRandomClass->getDouble();
   }
}

我试图通过以下方式做到这一点:

class MyClass
{
  public:
    struct drand48_data drand_buf;
    ...
}

void MyClass::generateData()
{
    double tmp;
    int i = 0;
    int temp_int;
    struct drand48_data drand_buf_local = drand_buf;

   #pragma omp parallel firstprivate(drand_buf_local) private(tmp)
    {
    seed = 1202107158 + omp_get_thread_num() * 1999;
    srand48_r (time(NULL), &drand_buf_local);
   #pragma omp for 
   for (i = 0; i < n; i++)
   {
      drand48_r(&drand_buf_local, &tmp);
      data_int[i] = (int)(tmp);
      drand48_r(&drand_buf_local, &tmp);
      data_int_help[i] = (int)(tmp);
      drand48_r(&drand_buf_local, &tmp);
      data_double[i] = tmp;

   }
}

但它不能正常工作,更准确地说,它不会根据线程数更快地工作,它总是一样的。也许有人可以帮我解决这个问题?

其他一些考虑:

我正在运行n = 30000000,我只能在方法中添加并行性generateData()

当我调用生成的方法 30 次时,我可以得到以下结果:

Sequentially: 35318 ms with 2 thread: 42094 ms

当我只打电话一次时:

With one thread: 1066 ms  With two thread: 778 ms

标签: c++cmultithreadingparallel-processingopenmp

解决方案


推荐阅读