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我调用这些函数时它们给出了无效的参数错误?
答案 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”“