C, OpenMP: как я могу сделать это парализацию тройного цикла лучше? - PullRequest
1 голос
/ 22 июля 2011

Я пытаюсь распараллелить алгоритм Floyd-Warshall , используя OpenMP (в основном редактирование 2D-массива на месте), но я сомневаюсь, что я делаю это наилучшим образом, вот что у меня так далеко:

    #pragma omp parallel for private(i, j, k) shared(g)
    for ( i = 0; i < n; i++ ) {
        for ( j = 0; j < n; j++ ) {
            for ( k = 0; k < n; k++ ) {
                g->A[j][k] = imin( g->A[j][k], g->A[j][i] + g->A[i][k] );
            }
        }
    }

Есть идеи, как мне лучше использовать OpenMP? На данный момент, который только наполовину сокращает время выполнения, несомненно, это может быть улучшено.

Кроме того, если кто-нибудь, как какие-либо предложения для других технологий, которые будут использоваться для распараллеливания, я весь слух. Я думал о MPI, но мне пришлось бы сделать всю мою функцию main параллельной, верно?

Спасибо.

EDIT

Код выше не работает, ответы ниже показывают, почему.

1 Ответ

2 голосов
/ 22 июля 2011

Распараллеливание алгоритма не является простым.См. Примечания здесь http://www.mcs.anl.gov/~itf/dbpp/text/node35.html для получения информации о его параллельном запуске.Если у вас небольшое количество процессоров (двух-, четырех-, восьмиъядерные), то Parallel Floyd 1, вероятно, вам подходит.Если у вас огромное количество процессоров (действительно потрясающий GPU, сетчатый компьютер), то Parallel Floyd 2 может быть лучше.

...