【发布时间】:2017-04-30 01:14:43
【问题描述】:
我正在用 cuda 提神醒脑,特别是统一内存(我最后一次真正的 cuda 开发是在 3 年前),我有点生疏了。
pb:
我正在使用统一内存从容器创建任务。但是,经过几天的调查,我遇到了崩溃, 我不能说崩溃在哪里(复制构造函数),但不能说为什么。因为所有的指针都被正确分配了。
我与 Nvidia 的帖子无关 (https://devblogs.nvidia.com/parallelforall/unified-memory-in-cuda-6/) 关于C++和统一内存
#include <cuda.h>
#include <cstdio>
template<class T>
struct container{
container(int size = 1){ cudaMallocManaged(&p,size*sizeof(T));}
~container(){cudaFree(p);}
__device__ __host__ T& operator[](int i){ return p[i];}
T * p;
};
struct task{
int* a;
};
__global__ void kernel_gpu(task& t, container<task>& v){
printf(" gpu value task %i, should be 2 \n", *(t.a)); // this work
task tmp(v[0]); // BUG
printf(" gpu value task from vector %i, should be 1 \n", *(tmp.a));
}
void kernel_cpu(task& t, container<task>& v){
printf(" cpu value task %i, should be 2 \n", *(t.a)); // this work
task tmp(v[0]);
printf(" cpu value task from vector %i, should be 1 \n", *(tmp.a));
}
int main(int argc, const char * argv[]) {
int* p1;
int* p2;
cudaMallocManaged(&p1,sizeof(int));
cudaMallocManaged(&p2,sizeof(int));
*p1 = 1;
*p2 = 2;
task t1,t2;
t1.a=p1;
t2.a=p2;
container<task> c(2);
c[0] = t1;
c[1] = t2;
//gpu does not work
kernel_gpu<<<1,1>>>(c[1],c);
cudaDeviceSynchronize();
//cpu should work, no concurent access
kernel_cpu(c[1],c);
printf("job done !\n");
cudaFree(p1);
cudaFree(p2);
return 0;
}
客观地说,我可以将一个对象作为参数传递给正确分配内存的地方。但是,看起来无法使用第二学位 间接的(这里是容器)
我犯了一个概念上的错误,但我看不出在哪里。
最好的,
提莫咖啡
我的机器:cuda 7.5、gcc 4.8.2、Tesla K20 m
【问题讨论】:
-
您的
task类没有构造函数,无法使其在 GPU 上正常工作。
标签: cuda