使用cuda直接访问全局内存

时间:2015-06-07 13:25:25

标签: c++ cuda

Q1- 假设我已经使用cudaMemCpyAsync通过stream1将一个数组复制到设备上; 我可以在不同的流中访问该数组的值吗?2?

cudaMemcpyAsync(da,a,10*sizeof(float),cudaMemcpyHostToDevice,stream[0]);
kernel<<<n,1,0,stream[0]>>>(da);
kernel<<<n,1,0,stream[1]>>>(da){//calculation involving da} ;

Q2- 我必须在内核调用中包含指向全局内存数组的指针吗?我不能直接从内核访问它吗?

__global__ void kernel() {out[threadidX.x]=2*input[threadIdx.x];  }

而不是

__global__ void kernel(float * out,float input){out[threadidX.x]=2*input[threadIdx.x];  }

q3- 假设我在一个函数中有所有malloc和memcpy,在另一个函数中有内核调用而在另一个函数中有cuda free我调用这些函数时它们给出了无效的参数错误?

1 个答案:

答案 0 :(得分:0)

  

q1-假设我已经使用cudaMemCpyAsync通过stream1将一个阵列复制到设备上;我可以在不同的流中访问该数组的值吗?2?

是的,可以在您显示的两个内核中访问数组da。但是,一个重要的问题是先前的cudaMemcpyAsync操作是否完成(或保证是完整的):

cudaMemcpyAsync(da,a,10*sizeof(float),cudaMemcpyHostToDevice,stream[0]);
kernel<<<n,1,0,stream[0]>>>(da);
kernel<<<n,1,0,stream[1]>>>(da){//calculation involving da} ;

在上面第一次内核启动的情况下,cudaMemcpyAsync操作保证完成。在第二种情况下,它不是。发送到相同流的操作保证被序列化,即按发布顺序执行。这可以保证在内核启动到同一个流之前完成cudaMemcpyAsync操作。发布到单独的流的CUDA活动可能会重叠,因此无法保证发送到与前面的cudaMemcpyAsync操作不同的流的内核将等到该操作完成。

  

q2-我是否必须将指向全局内存数组的指针作为内核调用中的参数?我不能直接从内核访问它吗?

这似乎是一个完全独立的问题。如果要在内核中使用该数据,动态分配全局内存数组(即使用cudaMalloc分配的内存数组)将要求您传递指向内核分配的指针。但是静态分配的数组:

__device__ int data[SIZE];

文件范围,您不需要(也不应该)将data指针作为内核参数传递。该data指针可以直接在内核中使用,而无需将其作为内核参数显式传递。 (请注意,您不使用cudaMemcpy来填充此类数组。)

  

q3-假设我在一个函数中调用了malloc和memcpy,在另一个函数中调用了内核,而当我调用这些函数时,他们在另一个函数中释放了cuda,它们给出了无效的参数错误吗?

除非您提供MCVE,否则我认为无法回答此问题。你为“1.Questions寻求调试帮助(”为什么这段代码不起作用?“)提供MCVE的expects”“