【发布时间】:2014-07-05 22:00:39
【问题描述】:
我有一个(长)可以并行执行的独立指令列表。这些不在循环中,它们只是这样:
istr1;
istr2;
...
istrN;
如何使用 OpenMP 将它们并行化?我知道我可以在一些 Pthread 中手动拆分它们,但我想知道是否有更简单的方法,可以自动将线程数调整为 CPU 数,就像 OpenMP 一样。
【问题讨论】:
标签: parallel-processing openmp
我有一个(长)可以并行执行的独立指令列表。这些不在循环中,它们只是这样:
istr1;
istr2;
...
istrN;
如何使用 OpenMP 将它们并行化?我知道我可以在一些 Pthread 中手动拆分它们,但我想知道是否有更简单的方法,可以自动将线程数调整为 CPU 数,就像 OpenMP 一样。
【问题讨论】:
标签: parallel-processing openmp
这就是 OpenMP 部分的用途。
#pragma omp parallel sections
{
#pragma omp section
istr1;
#pragma omp section
istr2;
...
#pragma omp section
istrN;
}
另一种选择是使用显式任务:
#pragma omp parallel
{
#pragma omp single
{
#pragma omp task
istr1;
#pragma omp task
istr2;
...
#pragma omp task
istrN;
}
}
任务是在single 构造中创建的,以防止在所有线程中创建它们(从而防止每个任务被创建 num_threads 次)。使用显式任务可能会带来更好的性能,因为大多数 OpenMP 运行时在调度部分时使用了相当愚蠢的逻辑。
【讨论】: