CUDA 托管内存不适用于不同的计算能力



当使用不同的计算功能编译时,此代码的工作方式不同:

#include <cuda.h>
#include <stdio.h>
__managed__ int m;
int main() {
printf("hi 1n");
m = -123;
printf("hi 2n");
}

具有计算能力的设备6.0:

$ nvcc main.cu -gencode arch=compute_60,code=sm_60 -rdc=true && ./a.out
hi 1
hi 2

具有计算能力的设备7.0:

$ nvcc main.cu -gencode arch=compute_60,code=sm_60 -rdc=true && ./a.out
hi 1
Segmentation fault

具有计算能力的设备7.0:

$ nvcc main.cu -gencode arch=compute_70,code=sm_70 -rdc=true && ./a.out
hi 1
hi 2

为什么我在使用计算能力6.0构建并在具有计算能力7.0的GPU上运行时出现分段故障

根据评论中的讨论,我有这个问题,因为我必须在构建过程中使用与GPU完全相同的计算能力。我没有收到任何错误的原因是我应该手动检查它们(使用CUDA运行时API检查错误的规范方法是什么?(。

如果我像这样扩展代码:

#include <cuda.h>
#include <stdio.h>
__managed__ int m;
__global__ void foo() {
printf("from foo: %d %dn", blockIdx.x, threadIdx.x);
}
int main() {
foo<<<2,2>>>();
printf("001n");
if (cudaPeekAtLastError() != cudaSuccess) abort();
printf("002n");
if (cudaDeviceSynchronize() != cudaSuccess) abort();
printf("hi 1n");
m = -123;
printf("hi 2n");
}

具有计算能力的设备7.0:

$ nvcc main.cu -gencode arch=compute_70,code=sm_70 -rdc=true && ./a.out
001
002
from foo: 0 0
from foo: 0 1
from foo: 1 0
from foo: 1 1
hi 1
hi 2

具有计算能力的设备7.0:

$ nvcc main.cu -gencode arch=compute_60,code=sm_60 -rdc=true && ./a.out
001
Aborted

最新更新