Проблемы с компиляцией кода OpenACC C с помощью GCC - PullRequest
1 голос
/ 14 июня 2019

У меня проблемы с получением примера кода 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.

...