我在获取一些带有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来代替它似乎很普遍。