c++ - 使用 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
解决方案
推荐阅读
- sql - 与 trim 等效的 T-SQL 查询(从 'CRIC2' 尾随 'C')
- python - 无法转换为字符串
- angular - 在 Angular 中隐藏组件
- ssl - 从私钥中提取公钥
- matplotlib - 在 xml 文件中绘制图形
- javascript - ReactIntl 仅在刷新浏览器时起作用。
- node.js - 如何使用环回模型查询对嵌套对象进行查询?
- javascript - CyberStart 评估挑战 11
- python - 使用隐含主机名的 ldap3 python 库连接到 LDAP 服务器
- sql-server-2016 - JBOSS EAP 7 无法连接到 sql 2016 服务器上的数据库