У меня проблемы с получением примера кода C с директивами openACC, который прекрасно компилируется с pgcc -acc
, для компиляции с использованием gcc -fopenacc
. Я не уверен, в чем проблема или как действовать. Этот код взят из семинара openACC, на котором я присутствовал, где они использовали pgcc
для компиляции, что означает, что код работает, но как начинающий пользователь openACC, я не могу найти способ заставить его работать с gcc
.
Я пытаюсь скомпилировать код в OpenSUSE Leap 15.0, используя gcc (SUSE Linux) 7.4.1 20190424 [gcc-7-branch revision 270538]
. Я установил nvptx на Yast. Мои спецификации GPU
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.67 Driver Version: 418.67 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:02:00.0 On | N/A |
| 20% 58C P0 63W / 250W | 2030MiB / 11177MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 108... Off | 00000000:03:00.0 Off | N/A |
| 0% 40C P8 10W / 250W | 2MiB / 11178MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
Я пробовал команды, предложенные по ссылка , а именно gcc -fopenacc -lm -foffload=-lm code.c
и их варианты, но всегда кажется, что что-то не так. Варианты, которые я взял с других сайтов, которые включают изменение используемых флагов, также, похоже, не работают. Использование вышеупомянутых gcc -fopenacc -lm -foffload=-lm code.c
компилируется, но, похоже, код работает неправильно.
Код, который я пытаюсь запустить, имитирует тепловое расширение лапласиана на металлической пластине. Он использует #include <math.h>
, поэтому я включил флаг -lm
. Соответствующий код (Джон Урбаник, PSC 2014) в main()
выглядит следующим образом
int i, j; // grid indexes
int max_iterations; // number of iterations
int iteration=1; // current iteration
double dt=100; // largest change in t
struct timeval start_time, stop_time, elapsed_time; // timers
printf("Maximum iterations [100-4000]?\n");
scanf("%d", &max_iterations);
gettimeofday(&start_time,NULL); // Unix timer
initialize(); // initialize Temp_last including boundary conditions
// do until error is minimal or until max steps
#pragma acc data copy(Temperature_last), create(Temperature)
while ( dt > MAX_TEMP_ERROR && iteration <= max_iterations ) {
// main calculation: average my four neighbors
#pragma acc kernels
for(i = 1; i <= ROWS; i++) {
for(j = 1; j <= COLUMNS; j++) {
Temperature[i][j] = 0.25 * (Temperature_last[i+1][j] + Temperature_last[i-1][j] +
Temperature_last[i][j+1] + Temperature_last[i][j-1]);
}
}
dt = 0.0; // reset largest temperature change
// copy grid to old grid for next iteration and find latest dt
#pragma acc kernels
for(i = 1; i <= ROWS; i++){
for(j = 1; j <= COLUMNS; j++){
dt = fmax( fabs(Temperature[i][j]-Temperature_last[i][j]), dt);
Temperature_last[i][j] = Temperature[i][j];
}
}
// periodically print test values
if((iteration % 100) == 0) {
#pragma acc update host(Temperature)
track_progress(iteration);
}
iteration++;
}
После компиляции с gcc -fopenacc -lm -foffload=-lm code.c
, запуск ./a.out
выводит "Maximum iterations [100-4000]?[\n]"
на консоль. После этого, кажется, просто вращается. Я не думаю, что он даже принимает ввод от scanf
Я пытаюсь дать его. Должны ctrl+c
до конца. Другие команды, которые я пробовал, gcc -fopenacc laplace_acc.c
, которые кричат на меня из-за fmax
. Я пропустил огромную часть кода, чтобы он был кратким, но дайте мне знать, если вам нужно больше.
Я прошу прощения, если это слишком простой вопрос или я просто упускаю что-то очень очевидное, но я действительно потерян. Я не очень знаком с использованием директив. Кроме того, мне было трудно найти ресурсы по компиляции openACC с GCC, поскольку вместо этого кажется, что для этого достаточно использовать Intel или PGI.