Векторизация циклов в OpenMP - PullRequest
0 голосов
/ 10 марта 2012

Я пишу программу на C (двумерный решатель Пуассона) и использую openMP для ускорения большого цикла for.Я заметил, что внутри параллельного блока openMP цикл for не векторизован даже в случае, когда я включаю директиву # pragma всегда вектор .Для компиляции я использую компилятор pathscale.

Код, который я хочу векторизовать, выглядит следующим образом:

  #pragma omp parallel shared(in, out, lambda,dim,C) private(k)
     {
            #pragma omp for  schedule(guided,dim/nthreads)  nowait  
            for(k = 0;k < dim; k++){
                    in[k]  = C*out[k]*lambda[k];
            }
    }

где out, lambda и in - массивы двойной точности.

Но даже если я включу # pragma всегда vector , ответ компилятора будет таким:

 warning: ignoring #pragma always vector

Знаете ли вы, есть ли обходной путь для этого?

Спасибо.

1 Ответ

3 голосов
/ 12 марта 2012

Я просмотрел Руководство пользователя для компилятора PathScale , и не нашел ни #pragma always, ни #pragma vector.Поэтому я думаю, что компилятор просто говорит вам, что он не распознает эту прагму и игнорирует ее.

Однако в разделе 7.4.5 я нашел следующие опции, которые должны помочь вам с векторизацией:

Векторизация кода пользователя ... контролируется флагом -LNO:simd[=(0|1|2)], который включает или отключает векторизацию внутреннего цикла.0 отключает векторизатор, 1 (по умолчанию) заставляет компилятор векторизоваться только в том случае, если он может определить, что нет нежелательного влияния на производительность из-за неоптимального выравнивания, а 2 будет векторизовать без каких-либо ограничений (это наиболее агрессивно).

-LNO:simd_verbose=ON выводит информацию о векторизаторе (от векторизации кода пользователя) до стандартного вывода.

В качестве примечания (отгадываю, откуда можно взять этот #pragma always vector), Компилятор Intel имеет #pragma vector с always, являющимся одним из возможных параметров прагмы.Но прагмы, как правило, зависят от компилятора, за исключением нескольких расширений (OpenMP - одно), которые поддерживаются несколькими поставщиками.

...