在不同的线程下运行相同代码有什么意义 - openMP?

时间:2018-02-22 10:49:35

标签: multithreading openmp

来自:https://bisqwit.iki.fi/story/howto/openmp/

  

并行构造

     

并行构造启动并行块。它创建了一个团队   N个线程(其中N在运行时确定,通常来自于   所有的CPU内核数量,但可能会受到一些影响   执行下一个语句(或下一个块,如果语句   是{...} -enclosure。在语句之后,线程重新加入   之一。

#pragma omp parallel  
   {  
     // Code inside this region runs in parallel.  
     printf("Hello!\n");  
   }

我想了解在不同线程下运行相同代码的重点。在什么样的情况下它会有所帮助?

4 个答案:

答案 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开始求和)。

endstart几乎相同,但它是线程总结到的数组索引的上限(例如:线程#0将总和到500,从{求和值} {1}}到A[0],而线程#1总和直到达到1000,值为A[499]A[500]

答案 2 :(得分:0)

OpenMP的基本思想是分发工作。为此,您需要创建一些线程。

parallel构造创建了这个线程数。之后,您可以与omp foromp task等其他结构进行分配/共享工作。

这种区别的一个可能的好处是,例如当你必须为每个线程分配内存(即线程本地数据)时。

答案 3 :(得分:0)

  

我想了解在不同线程下运行相同代码的重点。在什么样的情况下它会有所帮助?

一个例子:在物理学中,你的代码中有一个随机过程(碰撞,初始maxwellian等),你需要多次运行代码来获得平均结果,在这种情况下你需要多次运行相同的代码