我想知道是否有任何方法可以将 OpenMP 中的特定线程分配给特定的 CPU 内核?
I would like to know if there is any way to assign a particular thread in OpenMP to a specific CPU core?
我使用 OpenMP 在不同的线程中划分了一个简单的算法,但执行时间急剧增加。这可能是由于同一 CPU 核心上的所有线程 运行。我知道,如果我的 CPU 是双核或四核,那么分配的线程数多于 CPU 内核数将无济于事。但即使有两个线程,执行时间也在增加。
是的,您可以确定哪个 CPU 获得线程。
通过使用例如 talonmies 所建议的 Thread Affinity Interface (Linux* and Windows*)。但是,请注意文章中提到的内容:
thread affinity can have a dramatic effect on the application speed.
执行速度变慢,可能有两个主要原因:
1) 如果您的线程数多于核心数,则剩余的线程将等待其他线程,从而减少为串行执行。
话虽如此,假设您有 2 个内核,然后有 4 个线程准备执行,将导致竞争条件,因为所有这些线程都将争夺资源(即内核),因此其中 2 个线程将执行并行,但其他两个将不得不等待。
2) 你的问题规模较小。
运行 并行不是免费的。您必须做很多内务处理,并且通常要协调并行执行。您必须让 OpenMP 发挥作用,并且 OS 还必须处理更多 threads/processes。
所以,除非你的问题足够大,否则你不会看到任何加速(更糟糕的是,你会看到你的情况变慢),因为编排并行执行的开销将主导执行您的应用程序。
我使用 OpenMP 在不同的线程中划分了一个简单的算法,但执行时间急剧增加。这可能是由于同一 CPU 核心上的所有线程 运行。我知道,如果我的 CPU 是双核或四核,那么分配的线程数多于 CPU 内核数将无济于事。但即使有两个线程,执行时间也在增加。
是的,您可以确定哪个 CPU 获得线程。
通过使用例如 talonmies 所建议的 Thread Affinity Interface (Linux* and Windows*)。但是,请注意文章中提到的内容:
thread affinity can have a dramatic effect on the application speed.
执行速度变慢,可能有两个主要原因:
1) 如果您的线程数多于核心数,则剩余的线程将等待其他线程,从而减少为串行执行。
话虽如此,假设您有 2 个内核,然后有 4 个线程准备执行,将导致竞争条件,因为所有这些线程都将争夺资源(即内核),因此其中 2 个线程将执行并行,但其他两个将不得不等待。
2) 你的问题规模较小。
运行 并行不是免费的。您必须做很多内务处理,并且通常要协调并行执行。您必须让 OpenMP 发挥作用,并且 OS 还必须处理更多 threads/processes。
所以,除非你的问题足够大,否则你不会看到任何加速(更糟糕的是,你会看到你的情况变慢),因为编排并行执行的开销将主导执行您的应用程序。