Frage

Was ist der beste Weg, um mehrere Codezeilen parallel auszuführen, wenn sie nicht voneinander abhängig sind? (Ich benutze OpenMP)

Pseudocode:

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

Der einzige Weg, den ich mir einfallen lassen kann, ist:

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

Ich habe es nicht versucht, aber ich erinnere mich auch, dass du es nicht sollst break Während der Verwendung von OpenMP

War es hilfreich?

Lösung

Ich gehe davon aus, dass die individuellen Dinge, die Sie als unabhängige Aufgaben aufgeführt haben, nur Beispiele waren. Wenn sie wirklich Dinge sind wie y=a+b, Dann, wie @chrisaycock und @ejd gesagt haben, sind sie zu klein für diese Art von Parallelität (z. B. Thread basiert, im Gegensatz zu ILP oder so), um die Parallelität aufgrund von Gemeinkosten tatsächlich auszunutzen. Wenn sie jedoch größere Operationen sind, ist der Weg, die aufgabenbasierte Parallelität in OpenMP zu machen, mit dem task Richtlinie: z.

#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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top