CUDA 合作组:链接错误
CUDA Cooperative Groups : Linking error
在阅读了 CUDA 9 中的协作组之后,我一直在尝试在网格级别进行同步。
我使用的是 Visual Studio 2017、GTX 1060 和 CUDA 9.1。
我修改了我的代码如下:
__global__ void ExplicitKernel_American(/* ... */) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
auto grid = cooperative_groups::this_grid();
if (i < sizeS) {
//...
for (int j = 1; j < sizeT; ++j) {
// ...
grid.sync(); // __syncthreads();
}
}
}
并且,如文档中所述,我这样称呼我的内核:
void* Explicit_Args[] = { &PDE_Grid, /* ... */, &sizeS, &sizeT };
cudaLaunchCooperativeKernel(
(void*)ExplicitKernel_American,
dim3((sizeS + TPB - 1) / TPB),
dim3(TPB),
Explicit_Args
); // TPB being 256...
不幸的是,我在内核中添加 "grid" 部分后立即出现链接错误。
error LNK2001: unresolved external symbol __fatbinwrap_38_cuda_device_runtime_compute_70_cpp1_ii_8b1a5d37
fatal error LNK1120: 1 unresolved externals
我已经设置了 -rdc=true 和 sm_61 但找不到它不起作用的原因...有什么想法吗?
非常感谢!
使用协作内核启动(协作网格 - CG)需要 Pascal 或 Volta GPU,并且需要 Linux 或 windows 在 TCC 模式下运行的设备。如果你在设备属性结构中测试deviceProp.cooperativeLaunch
属性,我想你会发现它在你的WDDM模式下运行的GPU上是不支持的。
在尝试使用协作网格启动之前,最好在您的代码中对此进行测试 属性。
不过,您询问的问题是 compile/link 问题。为此,我的建议是研究CG(合作网格)示例代码,例如6_Advanced/reductionMultiBlockCG
。对于网格同步,绝对需要设置 -rdc=true
(即启用可重定位设备代码链接)。根据您设置 -rdc=true
的方式,它可能无法正确应用于您的项目。概述了正确的方法 here
这里的近端问题似乎是您没有正确链接到设备运行时库,例如-lcudadevrt
在阅读了 CUDA 9 中的协作组之后,我一直在尝试在网格级别进行同步。
我使用的是 Visual Studio 2017、GTX 1060 和 CUDA 9.1。
我修改了我的代码如下:
__global__ void ExplicitKernel_American(/* ... */) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
auto grid = cooperative_groups::this_grid();
if (i < sizeS) {
//...
for (int j = 1; j < sizeT; ++j) {
// ...
grid.sync(); // __syncthreads();
}
}
}
并且,如文档中所述,我这样称呼我的内核:
void* Explicit_Args[] = { &PDE_Grid, /* ... */, &sizeS, &sizeT };
cudaLaunchCooperativeKernel(
(void*)ExplicitKernel_American,
dim3((sizeS + TPB - 1) / TPB),
dim3(TPB),
Explicit_Args
); // TPB being 256...
不幸的是,我在内核中添加 "grid" 部分后立即出现链接错误。
error LNK2001: unresolved external symbol __fatbinwrap_38_cuda_device_runtime_compute_70_cpp1_ii_8b1a5d37
fatal error LNK1120: 1 unresolved externals
我已经设置了 -rdc=true 和 sm_61 但找不到它不起作用的原因...有什么想法吗?
非常感谢!
使用协作内核启动(协作网格 - CG)需要 Pascal 或 Volta GPU,并且需要 Linux 或 windows 在 TCC 模式下运行的设备。如果你在设备属性结构中测试deviceProp.cooperativeLaunch
属性,我想你会发现它在你的WDDM模式下运行的GPU上是不支持的。
在尝试使用协作网格启动之前,最好在您的代码中对此进行测试 属性。
不过,您询问的问题是 compile/link 问题。为此,我的建议是研究CG(合作网格)示例代码,例如6_Advanced/reductionMultiBlockCG
。对于网格同步,绝对需要设置 -rdc=true
(即启用可重定位设备代码链接)。根据您设置 -rdc=true
的方式,它可能无法正确应用于您的项目。概述了正确的方法 here
这里的近端问题似乎是您没有正确链接到设备运行时库,例如-lcudadevrt