来自:https://bisqwit.iki.fi/story/howto/openmp/
并行构造
并行构造启动并行块。它创建了一个团队 N个线程(其中N在运行时确定,通常来自于 所有的CPU内核数量,但可能会受到一些影响 执行下一个语句(或下一个块,如果语句 是{...} -enclosure。在语句之后,线程重新加入 之一。
#pragma omp parallel
{
// Code inside this region runs in parallel.
printf("Hello!\n");
}
我想了解在不同线程下运行相同代码的重点。在什么样的情况下它会有所帮助?
答案 0 :(得分:1)
我想了解在不同线程下运行相同代码的重点。在什么样的情况下它会有所帮助?
在不同数据上运行相同的代码时。
例如,如果我想反转10个矩阵,我可能会在10个线程上运行矩阵反转代码......与1个线程和for
循环相比,(理想情况下)获得10倍的加速。
答案 1 :(得分: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,从{求和值} {1}}到A[0]
,而线程#1总和直到达到1000,值为A[499]
到A[500]
)
答案 2 :(得分:0)
OpenMP的基本思想是分发工作。为此,您需要创建一些线程。
parallel
构造创建了这个线程数。之后,您可以与omp for
或omp task
等其他结构进行分配/共享工作。
这种区别的一个可能的好处是,例如当你必须为每个线程分配内存(即线程本地数据)时。
答案 3 :(得分:0)
我想了解在不同线程下运行相同代码的重点。在什么样的情况下它会有所帮助?
一个例子:在物理学中,你的代码中有一个随机过程(碰撞,初始maxwellian等),你需要多次运行代码来获得平均结果,在这种情况下你需要多次运行相同的代码