c - 我想知道是否有办法将 OpenMP 中的特定线程分配给特定的 CPU 核心?

标签 c multithreading performance parallel-processing openmp

使用 OpenMP,我将一个简单的算法划分在不同的线程中,但执行时间急剧增加。这可能是由于所有线程都在同一 CPU 核心上运行。我知道,如果我的 CPU 是双核或四核,那么分配的线程数量多于 CPU 核心数量不会有太大帮助。但即使有两个线程,执行时间也会增加。

最佳答案

是的,您可以确定哪个 CPU 获得线程

例如使用 Thread Affinity Interface (Linux* and Windows*) ,正如talonmies所建议的。但是,请注意文章中提到的内容:

thread affinity can have a dramatic effect on the application speed.

<小时/>

为了使执行速度变慢,可能有两个主要原因:

1) 如果线程数多于核心数,则剩余线程将等待其他线程,这会减少为串行执行。

话虽如此,假设您有 2 个核心,那么有 4 个线程准备执行,将导致竞争条件,因为所有这些线程都会竞争资源(即核心),因此其中 2 个线程将并行执行,但另外两个则必须等待。

2) 问题规模较小

并行运行并不是免费的。您必须做很多内务工作并通常协调并行执行。您必须让 OpenMP 发挥作用,操作系统也必须处理更多线程/进程。

因此,除非问题的规模足够大,否则您不会看到任何加速(更糟糕的是,您会看到速度减慢,就像您的情况一样),因为编排并行执行的开销将主导执行您的应用程序。

关于c - 我想知道是否有办法将 OpenMP 中的特定线程分配给特定的 CPU 核心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343817/

相关文章:

c - Switch 语句未编译

c - 如何从一个程序访问另一个程序的内存

c - 为什么这允许从 (char *) 提升到 (const char *)?

Android - C++ for 循环与从 Java 线程调用的 OpenMP(减少)并行化导致段错误

php - MySQL 查询未使用索引

c - 具有 char[] 名称的变量

java - 多线程时 onClick 随机不被调用

c# - 使 [IsOneWay=true] WCF 服务异步与在客户端使用任务调用同步方法之间是否存在显着差异?

C++ 数组运算符开销

MySQL查询计算列