OpenMP 运行时无法识别我的 GPU 设备

6

我正在尝试在我的本地机器上使用OpenMP将工作传送到我的GTX 1060显卡上。我的所有CUDA和Cublas示例都可以正常运行。但是,当我尝试运行一些OpenMP卸载时,它根本不起作用。为了支持OpenMP 5.0,我编译了GCC 10.2.0工具链。经过一些调试,我发现OpenMP运行时没有看到任何设备。例如,此代码显示为零:

#include <omp.h>
#include <stdio.h>

int main() {
    printf("%d\n", omp_get_num_devices());
    return 0;
}

不过,Nvidia工具链已经可用并运转正常:

$ nvidia-smi 
Sun Feb 21 23:06:40 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:1D:00.0 Off |                  N/A |
|  0%   37C    P8    12W / 200W |    584MiB /  6075MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

那我错过了什么?OpenMP运行时如何找到设备?
编辑:我在附加关于我的编译器的信息。
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/gcc/10.2.0/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure --prefix=/opt/gcc/10.2.0/
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)

使用以下命令编译代码:

gcc -fopenmp simple.c

你使用哪个编译器和什么编译选项? - Hristo Iliev
我使用了GCC 10.2.0并加上了-fopenmp标志。 - Addman
3
-fopenmp 无法启用卸载功能。您还需要传递-foffload=nvptx-none,告诉GCC您想要将卸载任务分配到NVIDIA设备上。如果出现nvptx-none不支持的错误,则说明您的GCC没有构建对它的支持。gcc -v显示构建配置信息。 - Hristo Iliev
你可以在回答中说明这个问题。我不知道我需要使用卸载支持编译我的编译器(而且这并不容易)。花了我一天的时间,但现在它已经可以工作了。我将编辑我的问题并添加提到的输出。 - Addman
这是答案,附有GCC维基页面上关于卸载的链接。 - Hristo Iliev
1个回答

5
要编译支持卸载的OpenMP代码,您需要告诉GCC要针对哪个精确平台。这可以通过使用-foffload=<platform>命令行选项来实现。对于NVIDIA设备,平台是nvptx-none,因此您需要使用以下方式进行编译:
gcc -fopenmp -foffload=nvidia-ptx simple.c

尽管GCC支持多个目标平台的卸载,但由于依赖关系,并非每个GCC发行版都启用了它们。例如,在我的Arch Linux上,GCC根本没有编译支持卸载。如果您在执行先前的命令时收到错误,则说明您的GCC未配置为支持NVIDIA。其中之一是gcc -v,它显示了编译器的配置情况以及其他信息。在配置选项中查找--enable-offload-targets=nvptx-none。GCC维基上的Offloading page提供有关支持的卸载目标以及如何构建它们的详细信息。

嗨,当我使用 -foffload=nvptx-none 时,它会编译成功,但 omp_get_num_devices() 返回0。当我使用 -foffload=nvidia-ptx 时,会出现“GCC未配置支持 nvidia-ptx 作为卸载目标”的错误信息。 - Shihab Shahriar Khan
@ShihabShahriarKhan 你可能需要使用正确的NVidia支持编译自己的GCC版本。 - Hristo Iliev
@HristoIliev,所以标志是“-foffload = nvidia-ptx”或“-foffload = nvptx-none”,还是这两个在幕后执行相同的操作?谢谢。 - velenos14
1
@velenos14 -foffload 后面的值是卸载目标名称。该名称可能会在 GCC 发布之间更改,因此应运行 gcc -v 并查找 OFFLOAD_TARGET_NAMES。在我的情况下(来自 Ubuntu 软件包的 GCC 9.4.0),该值为 OFFLOAD_TARGET_NAMES=nvptx-none:hsa,因此对于 NVidia PTX,参数将是 -foffload=nvptx-none,对于 AMD HSAIL 设备,参数将是 -foffload=hsa - Hristo Iliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接