我有一个(长)独立指令列表,可以并行执行。这些不是循环,它们就像这样:
istr1;
istr2;
...
istrN;
如何使用OpenMP并行化它们?我知道我可以手动将它们分成一些Pthreads,但我想知道是否有更直接的东西,并且可以自动调整线程数到CPU数量,就像OpenMP一样。
答案 0 :(得分:1)
这就是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运行时在调度节时都会使用相当愚蠢的逻辑。