为了使用CUDA 6中的统一内存功能,需要满足以下要求:
我使用的nvcc编译选项是,
nvcc -m64 -Xptxas=-Werror -arch=compute_30 -code=sm_30 -o UM UnifiedMem.cu
这段代码编译得很好。在执行期间,printf()会产生“分段错误”。感觉统一内存特性没有生效。变量ret的地址仍然是GPU的,但printf是在CPU上调用的。CPU试图访问未在CPU上分配的数据,因此会产生分段错误。有人能帮我吗?这里出了什么问题?
- 具有SM架构3.0或更高版本(Kepler类或更新版本)的GPU
- 64位主机应用程序和操作系统,除Android外
- Linux或Windows操作系统
- 系统:ubuntu 13.10(64位)
- GPU:GTX770
- CUDA:6.0
- 驱动程序版本:331.49
__device__ __managed__ int ret[1000];
__global__ void AplusB(int a, int b) {
ret[threadIdx.x] = a + b + threadIdx.x;
}
int main() {
AplusB<<< 1, 1000 >>>(10, 100);
cudaDeviceSynchronize();
for(int i=0; i<1000; i++)
printf("%d: A+B = %d\n", i, ret[i]);
return 0;
}
我使用的nvcc编译选项是,
nvcc -m64 -Xptxas=-Werror -arch=compute_30 -code=sm_30 -o UM UnifiedMem.cu
这段代码编译得很好。在执行期间,printf()会产生“分段错误”。感觉统一内存特性没有生效。变量ret的地址仍然是GPU的,但printf是在CPU上调用的。CPU试图访问未在CPU上分配的数据,因此会产生分段错误。有人能帮我吗?这里出了什么问题?
<-点击这里
),显示支持哪些操作系统。CUDA 6支持Ubuntu 13.04和12.04。我不确定那是否是问题所在,但您可能会在受支持的操作系统上更顺利。 - Robert Crovella