2013-08-14 3 views
1

Я работаю над тем, чтобы разделить векторный и матричный класс и столкнулся с проблемой. Каждый раз, когда у меня есть петля в формеПараллелизация компилятора PGI + =

для (int i = 0; i < n; i ++) b [i] + = a [i];

код имеет зависимость от данных и не будет распараллеливаться. При работе с компилятором Intel он достаточно умен, чтобы справиться с этим без каких-либо прагм (я бы хотел избежать прагмы без проверки зависимости только из-за большого количества циклов, подобных этому, и потому что случаи на самом деле более сложны, чем это, и Я бы хотел, чтобы он проверял на случай, если он существует).

Кто-нибудь знает о компиляторе для компилятора PGI, который бы разрешил это?

Спасибо,

Джастину

редактирования: Ошибка в цикл. Не копировалось вставка фактического цикла

+0

Простите, что это не мой фактический цикл, просто пытающийся показать пример и испортил формат. – jgCallahan

ответ

0

Я думаю, проблема в том, что вы не используете ключевое слово restrict в этих подпрограммах, поэтому компилятор C должен беспокоиться о сглаживании указателя.

Компиляция программы:

#include <stdlib.h> 
#include <stdio.h> 

void dbpa(double *b, double *a, const int n) { 
    for (int i = 0; i < n; i++) b[i] += a[i] ; 

    return; 
} 

void dbpa_restrict(double *restrict b, double *restrict a, const int n) { 
    for (int i = 0; i < n; i++) b[i] += a[i] ; 

    return; 
} 

int main(int argc, char **argv) { 
    const int n=10000; 
    double *a = malloc(n*sizeof(double)); 
    double *b = malloc(n*sizeof(double)); 

    for (int i=0; i<n; i++) { 
     a[i] = 1; 
     b[i] = 2; 
    } 

    dbpa(b, a, n); 
    double error = 0.; 
    for (int i=0; i<n; i++) 
     error += (3 - b[i]); 

    if (error < 0.1) 
     printf("Success\n"); 

    dbpa_restrict(b, a, n); 
    error = 0.; 
    for (int i=0; i<n; i++) 
     error += (4 - b[i]); 

    if (error < 0.1) 
     printf("Success\n"); 

    free(b); 
    free(a); 
    return 0; 
} 

с компилятором PGI:

$ pgcc -o tryautop tryautop.c -Mconcur -Mvect -Minfo 
dbpa: 
     5, Loop not vectorized: data dependency 
dbpa_restrict: 
    11, Parallel code generated with block distribution for inner loop if trip count is greater than or equal to 100 
main: 
    21, Loop not vectorized: data dependency 
    28, Loop not parallelized: may not be beneficial 
    36, Loop not parallelized: may not be beneficial 

дает нам информацию о том, что dbpa() рутины без ограничения ключевого слова не распараллеливаемая, но dbpa_restict() процедуры была.

Действительно, для такого рода вещей вам лучше использовать OpenMP (или TBB или ABB или ...), а не пытаться убедить компилятор автопараллелизировать для вас; вероятно, лучше всего использовать существующие пакеты линейной алгебры, плотные или редкие, в зависимости от того, что вы делаете.

+0

Jonathan, Спасибо за ваши комментарии. Я могу попробовать OpenMP (еще новичок в программировании на C++). Я бы использовал существующие пакеты линейной алгебры, но, к сожалению, это не мое решение. Я буду смотреть с использованием ограничений и OpenMP. Спасибо – jgCallahan

Смежные вопросы