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 回答
是的,可以在您显示的两个内核中访问数组
da
. 但是,一个重要的问题是之前的cudaMemcpyAsync
操作是否完成(或保证完成):在上面的第一个内核启动的情况下,保证
cudaMemcpyAsync
操作完成 . 在第二种情况下,它不是 . 发送到同一流的操作保证被序列化,即以发布顺序执行 . 这可以保证在内核启动到同一个流之前完成cudaMemcpyAsync
操作 . 发布到单独流的CUDA活动可能会重叠,因此无法保证发送到与前一个cudaMemcpyAsync
操作不同的流的内核将等到该操作完成 .这似乎是一个完全独立的问题 . 如果要在内核中使用该数据,动态分配的全局内存数组(即使用
cudaMalloc
分配的内存数组)将要求您将指针传递给内核的分配 . 但是静态分配的数组:有文件范围,你不需要(也不应该)将
data
指针作为内核参数传递 .data
指针可以直接在内核中使用,而无需将其作为内核参数显式传递 . (请注意,您不使用cudaMemcpy
来填充此类数组 . )除非你提供MCVE,否则我认为不能回答这个问题 . SO expects您为"1.Questions seeking debugging help ("提供了MCVE为什么这段代码不起作用? ")"