Я попытался компиляции программы с помощью следующей командной строки с помощью 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
$
Если вы не в состоянии получить такие результаты, могут быть проблемы с машины/инструменты, которые вы пытаетесь запустить на.
Что вы подразумеваете под «no output»? Единственный вывод, который вы должны увидеть, - это «программирование», которое является единственным выражением printf в коде. – Ruyk