【发布时间】:2019-03-19 07:09:59
【问题描述】:
我正在尝试使用 OMP 对一些代码进行多线程处理。目前我的顺序版本使用 rand() 生成一组具有一致种子的随机数,以便它们在每次运行时返回相同的结果。我想并行化我的代码,但 rand() 不是线程安全的。有人可以告诉我如何使用在线程上工作的随机数生成器,这样我就可以在每次测试时生成相同的数据集,类似于使用带有 rand() 的种子。我的并行化代码如下:
long linkCnt;
long j;
long t;
srand(randInit);
linkCnt=0; //Keep track of # of outgoing edges
#pragma omp parallel for schedule(runtime) private(t)
for(j = 0; j < G->N; j++)
{
if(i == j){
t = NO_CONN;
} else {
t = (rand() % ((MAX_EDGE_WEIGTH-1) * 2)+1); //50% of having no connection
if(t > MAX_EDGE_WEIGTH){
//t = INF; //Like no connection
t = NO_CONN; //Like no connection
} else {
linkCnt++;
G->visited[j] = VISITED; //Do this to find isolated nods that have no incomming edge
}
}
G->node[i][j] = t;
}
【问题讨论】:
-
你不能创建一个你使用的辅助函数来防止使用锁或其他东西同时访问
rand吗? -
小心这个。线程可能以不同的顺序调用 rand 函数,因此即使 rand 是线程安全的,如果随机数的顺序很重要,那么您唯一能做的就是确保所有操作都是有序的。您仍然可以并行执行操作,但是您必须添加大量同步,并且最终会花费更多时间进行阻塞。如果这是为了验证您的实现,您可能需要考虑基于位置进行散列,或者提前生成一个
G->N随机数数组,然后使用arr[j]而不是rand()。
标签: c multithreading random openmp