CUDA GPU __global__ 功能未完成
CUDA GPU __global__ function does not complete
__global__ void functionA()
{
printf("functionA");
}
int main()
{
printf("main1");
functionA<<<1,1>>>();
printf("main2");
}
我正在尝试 运行 对上述内容进行简单测试。但是程序只输出“main1”。程序也应该输出“functionA”和“main2”。
这似乎有两个原因:
首先你需要添加
cudaDeviceSynchronize();
在 CUDA 例程之后 阻塞主程序,直到设备完成所有任务。
此外,如果您在编译代码时设置了错误的 GPU architecture/compute 功能 XX
,则可能会发生这种情况
$ nvcc -gencode=arch=compute_XX,code=sm_XX -o my_app my_app.cu
在这种情况下,只有主机代码是运行,而加速器上的部分似乎将被省略。您可以找到 here 上不同硬件代数的相应编号 XX
的概览。你 运行ning 的 K20m 是 35
。所以应该是
$ nvcc -gencode=arch=compute_35,code=sm_35 -o my_app my_app.cu
你的情况。
如果您的系统中有多个图形加速器并且代码在错误的上执行,也可能会发生这种情况。每个图形 card/accelerator 都分配有一个特定的 设备 ID。编号为 0
的设备应自动分配给功能最强大的设备,并默认使用。因此,我第一次在包含功能强大的 Tesla K80(架构 37
)和低功耗 Quadro P620(架构 60
)的系统上编译代码时,我 selected 37
并且在 selecting 60
代码 运行 时出现了相同的错误。然后我使用 Querying Device Properties example 给我一个支持 CUDA 的设备及其相应设备 ID 的列表,只是为了发现在我的系统上 Tesla K80
被设置为 1
和2
而简单的Quadro P620
显卡设置为0
。我假设是这种情况,因为 K80 在 CUDA 11 中已被弃用!
您可以 select 您代码中的设备 cudaSetDevice
or
$ CUDA_VISIBLE_DEVICES="1" ./my_app
其中 1
必须替换为您要使用的设备 ID。这样做应该使您的代码 运行 没有任何问题。
您还可以通过克隆 Github repository of "Learn CUDA Programming",然后浏览 Chapter01/01_cuda_introduction/01_hello_world/
,用 $ make
编译 make 文件,最后 运行 来测试这是否真的是问题所在它与 $ ./hello_world
。它会自动编译多个 architectures/compute 功能,因此应该 运行 没有任何问题!
__global__ void functionA()
{
printf("functionA");
}
int main()
{
printf("main1");
functionA<<<1,1>>>();
printf("main2");
}
我正在尝试 运行 对上述内容进行简单测试。但是程序只输出“main1”。程序也应该输出“functionA”和“main2”。
这似乎有两个原因:
首先你需要添加
cudaDeviceSynchronize();
在 CUDA 例程之后 阻塞主程序,直到设备完成所有任务。
此外,如果您在编译代码时设置了错误的 GPU architecture/compute 功能
XX
,则可能会发生这种情况$ nvcc -gencode=arch=compute_XX,code=sm_XX -o my_app my_app.cu
在这种情况下,只有主机代码是运行,而加速器上的部分似乎将被省略。您可以找到 here 上不同硬件代数的相应编号
XX
的概览。你 运行ning 的 K20m 是35
。所以应该是$ nvcc -gencode=arch=compute_35,code=sm_35 -o my_app my_app.cu
你的情况。
如果您的系统中有多个图形加速器并且代码在错误的上执行,也可能会发生这种情况。每个图形 card/accelerator 都分配有一个特定的 设备 ID。编号为
0
的设备应自动分配给功能最强大的设备,并默认使用。因此,我第一次在包含功能强大的 Tesla K80(架构37
)和低功耗 Quadro P620(架构60
)的系统上编译代码时,我 selected37
并且在 selecting60
代码 运行 时出现了相同的错误。然后我使用 Querying Device Properties example 给我一个支持 CUDA 的设备及其相应设备 ID 的列表,只是为了发现在我的系统上Tesla K80
被设置为1
和2
而简单的Quadro P620
显卡设置为0
。我假设是这种情况,因为 K80 在 CUDA 11 中已被弃用!您可以 select 您代码中的设备
cudaSetDevice
or$ CUDA_VISIBLE_DEVICES="1" ./my_app
其中
1
必须替换为您要使用的设备 ID。这样做应该使您的代码 运行 没有任何问题。
您还可以通过克隆 Github repository of "Learn CUDA Programming",然后浏览 Chapter01/01_cuda_introduction/01_hello_world/
,用 $ make
编译 make 文件,最后 运行 来测试这是否真的是问题所在它与 $ ./hello_world
。它会自动编译多个 architectures/compute 功能,因此应该 运行 没有任何问题!