1

複数行のコードが相互に依存していない場合、それらを並行して実行するための最良の方法は何ですか?(私はOpenMPを使用しています)

擬似コード:

database->connect()
openfile("stuff.txt")
ping("stackoverflow.com")
x = 2;
y = a + b;

私が思いつくことができる唯一の方法は次のとおりです。

#pragma omp parallel for
for(i = 0; i < 5; i++)
switch (i) {
case 0: database->connect(); break;
...

break試したことはありませんが、OpenMPを使用している間は試してはいけないことも覚えています。

4

1 に答える 1

0

したがって、独立したタスクとしてリストした個々のことは単なる例であると思います。それらが本当にのようなものy=a+bである場合、@ chrisaycockと@ejdが言ったように、オーバーヘッドのためにこの種の並列処理(ILPなどではなくスレッドベース)を実際に利用するには小さすぎます。しかし、それらがより大きな操作である場合、OpenMPでタスクベースの並列処理を行う方法は、taskディレクティブを使用することです。

#include <stdio.h>
#include <omp.h>
#include <unistd.h>

void work(int *v) {
    *v = omp_get_thread_num();
    sleep(1);
}

int main(int argc, char **argv)
{
    int a, b, c;
    #pragma omp parallel
    {
        #pragma omp single
        {
            #pragma omp task shared(a) default(none)
            work(&a);

            #pragma omp task shared(b) default(none)
            work(&b);

            #pragma omp task shared(c) default(none)
            work(&c);
        }
    }
    printf("a,b,c = %d,%d,%d\n", a, b, c);

    return 0;
}
于 2011-04-27T17:02:31.393 に答える