CUDA 托管内存不适用于不同的计算能力
CUDA managed memory doesn't work with different compute capability
当使用不同的计算能力编译时,此代码的工作方式不同:
#include <cuda.h>
#include <stdio.h>
__managed__ int m;
int main() {
printf("hi 1\n");
m = -123;
printf("hi 2\n");
}
计算能力为 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 完全相同的计算能力。
我没有收到任何错误的原因是我应该手动检查它们 (What is the canonical way to check for errors using the CUDA runtime API?)。
如果我像这样扩展这段代码:
#include <cuda.h>
#include <stdio.h>
__managed__ int m;
__global__ void foo() {
printf("from foo: %d %d\n", blockIdx.x, threadIdx.x);
}
int main() {
foo<<<2,2>>>();
printf("001\n");
if (cudaPeekAtLastError() != cudaSuccess) abort();
printf("002\n");
if (cudaDeviceSynchronize() != cudaSuccess) abort();
printf("hi 1\n");
m = -123;
printf("hi 2\n");
}
计算能力为 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
当使用不同的计算能力编译时,此代码的工作方式不同:
#include <cuda.h>
#include <stdio.h>
__managed__ int m;
int main() {
printf("hi 1\n");
m = -123;
printf("hi 2\n");
}
计算能力为 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 完全相同的计算能力。 我没有收到任何错误的原因是我应该手动检查它们 (What is the canonical way to check for errors using the CUDA runtime API?)。
如果我像这样扩展这段代码:
#include <cuda.h>
#include <stdio.h>
__managed__ int m;
__global__ void foo() {
printf("from foo: %d %d\n", blockIdx.x, threadIdx.x);
}
int main() {
foo<<<2,2>>>();
printf("001\n");
if (cudaPeekAtLastError() != cudaSuccess) abort();
printf("002\n");
if (cudaDeviceSynchronize() != cudaSuccess) abort();
printf("hi 1\n");
m = -123;
printf("hi 2\n");
}
计算能力为 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