使用GCC编译OpenACC C代码时遇到问题

时间:2019-06-14 20:30:04

标签: c openacc

我在获取一些带有openACC指令的示例C代码时遇到麻烦,该指令可以使用pgcc -acc进行编译,而无法使用gcc -fopenacc进行编译。我不确定问题是什么或如何进行。这段代码来自我参加的openACC研讨会,他们使用pgcc进行了编译,这意味着代码可以工作,但是作为openACC的初学者,我无法找到使其与gcc一起使用的方法。

我正在尝试使用gcc (SUSE Linux) 7.4.1 20190424 [gcc-7-branch revision 270538]在OpenSUSE Leap 15.0上编译代码。我已经在Yast上安装了nvptx。我的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 |
+-------------------------------+----------------------+----------------------+

我尝试了link上建议的命令,即gcc -fopenacc -lm -foffload=-lm code.c及其变体,但是似乎总是有问题。我从其他站点获取的涉及更改已使用标志的变体似乎也不起作用。使用上述gcc -fopenacc -lm -foffload=-lm code.c进行编译,但是代码似乎无法正常运行。

我正在尝试运行的代码在金属板上模拟拉普拉斯热膨胀。它使用#include <math.h>,所以我加入了-lm标志。 main()中的相关代码(由John Urbanic,PSC 2014)看起来像这样

    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而对我大叫。为了使内容简短,我已经省略了很大一部分代码,但是请告诉我是否需要更多代码。

如果这是一个太基本的问题,或者我只是缺少非常明显的东西,我深表歉意,但我确实迷失了。我对使用指令不是很熟悉。另外,我发现很难找到有关在GCC上编译openACC的资源,因为使用Intel或PGI来代替它似乎很普遍。

0 个答案:

没有答案