cuDevicePrimaryCtx在 acc_init 之后保留 returns CUDA_ERROR_INVALID_DEVICE

cuDevicePrimaryCtxRetain returns CUDA_ERROR_INVALID_DEVICE after acc_init

我正在尝试使用玩具示例(见下文)的新 PGI 社区版本 (17.4),但我在 CUDA 驱动程序中遇到错误 api调用 acc_init 时。

重现错误的代码是:

#include <openacc.h>
#include <cuda_runtime_api.h>
#include <stdio.h>

int main()
{
   acc_init( acc_device_nvidia );

   int ndev = acc_get_num_devices( acc_device_nvidia );

   printf("Num OpenACC devices: %d\n", ndev);

   cudaGetDeviceCount(&ndev);

   printf("Num CUDA devices: %d\n", ndev);

   return 0;
}

编译: /usr/local/pgi/linux86-64/17.4/bin/pgcc -acc -ta=tesla -Mcuda ./test.c -o oacc_test.pgi

cuda 内存检查输出:

$ cuda-memcheck ./oacc_test.pgi 
========= CUDA-MEMCHECK
========= Program hit CUDA_ERROR_INVALID_DEVICE (error 101) due to "invalid device ordinal" on CUDA API call to cuDevicePrimaryCtxRetain. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so (cuDevicePrimaryCtxRetain + 0x15c) [0x1e8d1c]
=========     Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccnc.so (__pgi_uacc_cuda_initdev + 0x80b) [0x6f0b]
=========     Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccg.so (__pgi_uacc_enumerate + 0x148) [0x11388]
=========     Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccg.so (__pgi_uacc_initialize + 0x5b) [0x117ab]
=========     Host Frame:/usr/local/pgi/linux86-64/17.4/lib/libaccapi.so (acc_init + 0x22) [0xe4f2]
=========     Host Frame:./oacc_test.pgi [0xbc4]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xf1) [0x202b1]
=========     Host Frame:./oacc_test.pgi [0xaca]
=========
Num OpenACC devices: 1
Num CUDA devices: 1
========= ERROR SUMMARY: 1 error

显然 __pgi_uacc_cuda_initdev 将“-1”作为第二个参数 (CUdevice dev) 传递给 cuDevicePrimaryCtxRetain(错误?):

Breakpoint 1, 0x00007ffff4ab0bc0 in cuDevicePrimaryCtxRetain () from /usr/lib/x86_64-linux-gnu/libcuda.so
(cuda-gdb) p /x $rsi
 = 0xffffffff

我想这不正常。这是 17.4 的错误还是我的安装损坏了?

这是正常的良性错误。基本上发生的事情是 PGI 运行时正在查询是否已经创建了 CUDA 上下文。但是由于没有 CUDA 运行时调用来查询上下文的存在,我们调用 "cuDevicePrimaryCtxRetain"。如果它出错,那么我们知道我们需要创建一个新的上下文。

请注意,在 PGI 版本 17.7 中,我们确实稍微更改了此调用,因此您在 运行 cuda-memcheck 时将不再看到错误。