gpt4 book ai didi

c++ - 当我通过 OMP(C++) 生成随机数时出现一个奇怪的问题

转载 作者:行者123 更新时间:2023-12-05 03:35:06 25 4
gpt4 key购买 nike

代码如下:

#include<omp.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
unsigned int seed = 1;
int n =4;
int i = 0;
#pragma omp parallel for num_threads(4) private(seed)
for(i=0;i<n;i++)
{
int temp1 = rand_r(&seed);
printf("\nRandom number: %d by thread %d\n", temp1, omp_get_thread_num());
}
return 0;
}

代码输出为:

Random number: 1905891579 by thread 0

Random number: 1012484 by thread 1

Random number: 1012484 by thread 2

Random number: 1012484 by thread 3

这对我来说很奇怪:为什么线程 0 有不同的编号?但是当我用常量数字 4 更改 n 时:

#include<omp.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{
unsigned int seed = 1;
const int n =4;
int i = 0;
#pragma omp parallel for num_threads(4) private(seed)
for(i=0;i<n;i++)
{
int temp1 = rand_r(&seed);
printf("\nRandom number: %d by thread %d\n", temp1, omp_get_thread_num());
}
return 0;
}

代码输出为:

Random number: 1012484 by thread 2

Random number: 1012484 by thread 3

Random number: 1012484 by thread 0

Random number: 1012484 by thread 1

所有线程都有相同的随机数。我不明白当 n 不是 const 变量时线程 0 具有不同编号的原因。有没有人知道这件事?非常感谢。

最佳答案

seed 被声明为 private,因此在循环中它没有初始化值,更多的是,每​​个实例可能有也可能没有不同的值,其值的使用是 UB .您可以使用 firstprivate让私有(private)实例用原始值初始化。

#pragma omp parallel for num_threads(4) firstprivate(seed)

此外,rand_r 不是标准函数,而是 2 级线程安全 POSIX 函数。级别 2 意味着 rand_r 只有在单独的对象/数据源上使用时才是安全的,这里不是这种情况,我会使用相同的种子计数器。在这种情况下,线程被调用的顺序是不确定的和不同步的。奇怪的输出是可能的,因为任何一个线程都可能有机会在其他线程之前更新种子的值。

关于c++ - 当我通过 OMP(C++) 生成随机数时出现一个奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69969421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com