2014-02-04 2 views
0

Я студент-студент, изучающий открытый ACC в интернатуре.open ACC: нет выхода с компилятором PGI

Я сделал основной образец кода сам для тестирования PGI рабочих станций компилятора (версия 14.1) работает хорошо, и он работал с командной строкой инструкцией «PGCC -acc lab04.c -Minfo»

Но есть странная проблема, которую я иметь. @@ Нет выхода нигде! @@

Я уверен, что компилятор работает хорошо, а ядра тоже. Но, наверное, должны быть ошибки.

Не могли бы вы помочь мне?

Я выведу весь код.

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


float scaled(float* v1, float* v2, float a, int n) 
{ 
int i; 
float sum = 0.0f; 

#pragma acc kernels loop 
for(i=0;i<n;i++) 
{ 
    v1[i]+=a*v2[i]; 
    sum+=v1[i]; 
} 

return sum; 
} 

int main(int argc, char* argv[]) 
{ 
int n; 

float *vector1; 
float *vector2; 

if(argc > 1) 
    n = atoi(argv[1]); 
else 
    n = 100000; 
if(n <= 0) n = 100000; 


vector1=(float*)malloc(n*sizeof(float)); 
vector2=(float*)malloc(n*sizeof(float)); 


scaled(vector1, vector2, 3.3, n); 


printf("programming done\n"); 

return 0; 

} 
+0

Что вы подразумеваете под «no output»? Единственный вывод, который вы должны увидеть, - это «программирование», которое является единственным выражением printf в коде. – Ruyk

ответ

2

Я попытался компиляции программы с помощью следующей командной строки с помощью PGI 13.10 компилятора инструменты:

pgcc -acc -ta=nvidia,cc20,cuda5.0 -o t1 t1.c -Minfo 

И получил этот результат:

scaled: 
10, Generating present_or_copy(v1[0:n]) 
    Generating present_or_copyin(v2[0:n]) 
    Generating NVIDIA code 
    Generating compute capability 2.0 binary 
11, Complex loop carried dependence of '*(v2)' prevents parallelization 
    Loop carried dependence of '*(v1)' prevents parallelization 
    Loop carried backward dependence of '*(v1)' prevents vectorization 
    Accelerator scalar kernel generated 
14, Sum reduction generated for sum 

Хотя это действительно указывает компиляции был " успешно ", сообщения о« предотвращении распараллеливания »указывают на то, что компилятор не был успешным в действительно выгодном ускорителя. Когда вы увидите сообщение Accelerator scalar kernel generated, вы часто будете недовольны результатами.

Когда я запускаю программу, как скомпилированные выше, я получаю сообщение об ошибке выполнения:

call to cuLaunchKernel returned error 701: Launch out of resources 

Это приходит ошибку из подсистемы выполнения CUDA. Вы можете увидеть или не увидеть такую ​​ошибку в зависимости от того, какое устройство ускорителя вы пытаетесь запустить. Мы могли бы понять, как это решить, но это действительно не так, потому что ваша программа не имеет надлежащей структуры, чтобы использовать ускоритель.

Компилятора выдавший «предотвращает параллелизацию» сообщения, так как он является строгим о указателях vector1 (или v1) и vector2 (или v2). Предполагается, что эти указатели могут псевдонимы друг другу и поэтому не могут создать правильную параллельную программу в этом случае. Так как это, вероятно, не ваше намерение (вы, вероятно, намереваетесь v1 и v2 ссылаться на отдельные пробелы), вы можете «заверить» компилятор, изменив параметры функции scaled с помощью ключевого слова C99 restrict. Это позволяет компилятору выполнять свою работу так, как вы, вероятно, собираетесь.

Вот модифицированный код и результаты:

$ cat t1.c 
#include <stdio.h> 
#include <stdlib.h> 

float scaled(float *restrict v1, float *restrict v2, float a, int n) 
{ 
    int i; 
    float sum = 0.0f; 

    #pragma acc kernels 
    for(i=0;i<n;i++) 
    { 
    v1[i]+=a*v2[i]; 
    sum+=v1[i]; 
    } 

    return sum; 
} 

int main(int argc, char* argv[]) 
{ 
    int n; 

    float *vector1; 
    float *vector2; 

    if(argc > 1) 
    n = atoi(argv[1]); 
    else 
    n = 100000; 
    if(n <= 0) n = 100000; 


    vector1=(float*)malloc(n*sizeof(float)); 
    vector2=(float*)malloc(n*sizeof(float)); 


    scaled(vector1, vector2, 3.3, n); 


    printf("programming done\n"); 

    return 0; 

} 

$ pgcc -acc -ta=nvidia,cc20,cuda5.0 -o t1 t1.c -Minfo 
scaled: 
    10, Generating present_or_copy(v1[0:n]) 
     Generating present_or_copyin(v2[0:n]) 
     Generating NVIDIA code 
     Generating compute capability 2.0 binary 
    11, Loop is parallelizable 
     Accelerator kernel generated 
     11, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */ 
    14, Sum reduction generated for sum 
$ ./t1 
programming done 
$ 

Если вы не в состоянии получить такие результаты, могут быть проблемы с машины/инструменты, которые вы пытаетесь запустить на.

1

FYI, я был в состоянии помочь этому пользователю на форумах пользователей PGI (см .: http://www.pgroup.com/userforum/viewtopic.php?t=4164). Помимо вопроса о наследовании указателя, о котором указывает Роберт, он использовал более старый графический процессор NVIDIA, который больше не нацелен по умолчанию и ему необходимо добавить «-ta = tesla: cc10».

Обратите внимание, что цель цели «tesla» была добавлена ​​в 14.1.Для более ранних версий замените «tesla» на «nvidia».

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