在不同的线程下运行相同的代码有啥意义 - openMP?
Posted
技术标签:
【中文标题】在不同的线程下运行相同的代码有啥意义 - openMP?【英文标题】:What is the point of running same code under different threads - openMP?在不同的线程下运行相同的代码有什么意义 - openMP? 【发布时间】:2018-02-22 10:49:35 【问题描述】:发件人:https://bisqwit.iki.fi/story/howto/openmp/
平行结构
并行构造启动一个并行块。它创建了一个团队 N 个线程(其中 N 在运行时确定,通常来自 CPU 核心数,但可能会受到一些因素的影响),所有 执行下一条语句(或下一个块,如果语句 是一个 ... -enclosure)。语句之后,线程重新加入 一个。
#pragma omp parallel
// Code inside this region runs in parallel.
printf("Hello!\n");
我想了解在不同线程下运行相同代码的意义何在。在什么情况下会有帮助?
【问题讨论】:
【参考方案1】:通过使用omp_get_thread_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]
start
是线程开始求和的下限(例如:线程 #0 将从 0 开始求和,而线程 #1 将从 500 开始求和)。
end
与 start
几乎相同,但它是线程将求和的数组索引的上限(例如:线程 #0 将求和直到 500,将值从 A[0]
求和到 @ 987654328@,而线程#1 将求和直到达到 1000,值从 A[500]
到 A[999]
)
【讨论】:
【参考方案2】:我想了解在不同线程下运行相同代码的意义何在。在什么情况下会有帮助?
当您在不同的数据上运行相同的代码时。
例如,如果我想反转 10 个矩阵,我可能会在 10 个线程上运行矩阵反转代码......与 1 个线程和 for
循环相比,获得(理想情况下)10 倍的加速。
【讨论】:
【参考方案3】:OpenMP 的基本思想是分配工作。为此,您需要创建一些线程。
parallel
构造创建了这个数量的线程。之后,您可以与 omp for
或 omp task
等其他构造分发/共享工作。
这种区别的一个可能的好处是,例如当您必须为每个线程(即线程本地数据)分配内存时。
【讨论】:
【参考方案4】:我想了解在不同线程下运行相同代码的意义何在。在什么情况下会有帮助?
一个例子:在物理学中,您的代码中有一个随机过程(碰撞、初始麦克斯韦等),您需要多次运行代码以获得平均结果,在这种情况下,您需要多次运行相同的代码.
【讨论】:
以上是关于在不同的线程下运行相同的代码有啥意义 - openMP?的主要内容,如果未能解决你的问题,请参考以下文章