在不同的线程下运行相同的代码有啥意义 - 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 开始求和)。

endstart 几乎相同,但它是线程将求和的数组索引的上限(例如:线程 #0 将求和直到 500,将值从 A[0] 求和到 @ 987654328@,而线程#1 将求和直到达到 1000,值从 A[500]A[999])

【讨论】:

【参考方案2】:

我想了解在不同线程下运行相同代码的意义何在。在什么情况下会有帮助?

当您在不同的数据上运行相同的代码时。

例如,如果我想反转 10 个矩阵,我可能会在 10 个线程上运行矩阵反转代码......与 1 个线程和 for 循环相比,获得(理想情况下)10 倍的加速。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

我想了解在不同线程下运行相同代码的意义何在。在什么情况下会有帮助?

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

【讨论】:

以上是关于在不同的线程下运行相同的代码有啥意义 - openMP?的主要内容,如果未能解决你的问题,请参考以下文章

这些在 UI 线程上运行代码的方法有啥区别?

这有啥意义吗,我的电脑只能并行运行 4 个线程?

xmlHttpRequest.open 和 xmlHttp.open 有啥不同

如果 GIL 存在,Python 中的多线程有啥意义?

Node.js 开头有啥意义? [关闭]

jmeter压力测试,线程数500,线程组只有一个接口和线程数500,线程组有多个接口,两者有啥不同吗?