Multithreading 在不同的线程下运行相同的代码有什么意义-openMP?
发件人: 平行结构 并行构造启动并行块。它创建了一个团队 N个线程(其中N在运行时确定,通常从Multithreading 在不同的线程下运行相同的代码有什么意义-openMP?,multithreading,openmp,Multithreading,Openmp,发件人: 平行结构 并行构造启动并行块。它创建了一个团队 N个线程(其中N在运行时确定,通常从 CPU核的数量,但可能会受到一些因素的影响),所有 执行下一条语句(或下一个块,如果该语句 是一个{…}-enclosure)。在语句之后,线程重新连接到 一个 我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助?OpenMP的基本思想是分配工作。为此,您需要创建一些线程 parallel构造创建这个数量的线程。之后,您可以将工作分配/共享给其他构件,如omp for或omp task
CPU核的数量,但可能会受到一些因素的影响),所有 执行下一条语句(或下一个块,如果该语句 是一个{…}-enclosure)。在语句之后,线程重新连接到 一个
我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助?OpenMP的基本思想是分配工作。为此,您需要创建一些线程
parallel
构造创建这个数量的线程。之后,您可以将工作分配/共享给其他构件,如omp for
或omp task
这种区别的一个可能好处是,当您必须为每个线程分配内存(即线程本地数据)时。OpenMP的基本思想是分配工作。为此,您需要创建一些线程
parallel
构造创建这个数量的线程。之后,您可以将工作分配/共享给其他构件,如omp for
或omp task
这种区别的一个可能好处是,当您必须为每个线程分配内存(即线程本地数据)时
我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助
当您在不同的数据上运行相同的代码时
例如,如果我想反转10个矩阵,我可以在10个线程上运行矩阵反转代码。。。与1个线程和循环相比,获得(理想情况下)10倍的加速比
我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助
当您在不同的数据上运行相同的代码时
例如,如果我想反转10个矩阵,我可以在10个线程上运行矩阵反转代码。。。要获得(理想情况下)10倍于1个线程的加速比和循环的。通过使用omp\u get\u thread\u num()
可以检索线程ID,从而使您能够针对该线程ID参数化所谓的“相同代码”
举个例子:
A
是一个1000维整数数组,需要使用2个OpenMP线程对其值求和
您可以设计如下代码:
int A_dim = 1000
long sum[2] = {0,0}
#pragma omp parallel
{
int threadID = omp_get_thread_num();
int start = threadID * (A_dim / 2)
int end = (threadID + 1) * (A_dim / 2)
for(int i = start; i < end; i++)
sum[threadID] += A[i]
}
int A_dim=1000
长和[2]={0,0}
#pragma-omp并行
{
int threadID=omp_get_thread_num();
int start=threadID*(A_dim/2)
int end=(线程ID+1)*(A_dim/2)
for(int i=start;i
start
是线程开始求和的下限(例如:线程#0将从0开始求和,而线程#1将从500开始求和)
end
与start
几乎相同,但它是线程将求和到的数组索引的上限(例如:线程0将求和到500,求和值从A[0]
到A[499]
,而线程1将求和到1000,求和值从A[500]
到A[999]
)通过使用omp\u get\u thread\u num()
您可以检索线程ID,该ID使您能够针对该线程ID参数化所谓的“相同代码”
举个例子:
A
是一个1000维整数数组,需要使用2个OpenMP线程对其值求和
您可以设计如下代码:
int A_dim = 1000
long sum[2] = {0,0}
#pragma omp parallel
{
int threadID = omp_get_thread_num();
int start = threadID * (A_dim / 2)
int end = (threadID + 1) * (A_dim / 2)
for(int i = start; i < end; i++)
sum[threadID] += A[i]
}
int A_dim=1000
长和[2]={0,0}
#pragma-omp并行
{
int threadID=omp_get_thread_num();
int start=threadID*(A_dim/2)
int end=(线程ID+1)*(A_dim/2)
for(int i=start;i
start
是线程开始求和的下限(例如:线程#0将从0开始求和,而线程#1将从500开始求和)
end
与start
几乎相同,但它是线程将求和到的数组索引的上限(例如:线程0将求和到500,求和值从A[0]
到A[499]
,而线程1将求和到1000,求和值从A[500]
到A[999]
)
我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助
一个例子:在物理学中,你的代码中有一个随机过程(碰撞、初始麦克斯韦等),你需要多次运行代码才能得到平均结果,在这种情况下,你需要多次运行相同的代码
我想了解在不同线程下运行相同代码的意义。在什么样的情况下它会有帮助
一个例子:在物理学中,你的代码中有一个随机过程(碰撞、初始麦克斯韦等),你需要多次运行代码才能得到平均结果,在这种情况下,你需要多次运行相同的代码