使用cuda直接访问全局内存

direct global memory access using 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 当我调用这些函数时,它们给出了无效参数错误?

q1- lets say i have copy one array onto device through stream1 using cudaMemCpyAsync; would i be able to access the values of that array in different stream say 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- would i have to include pointer to global memory array as argument in kernel call? can't i directly access it from the kernel?

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

__device__ int data[SIZE];

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

q3- lets say i have all malloc and memcpy in one function and kernel call in another function and cuda free in another when i call these function they gave invalid argument error?

我不认为这个问题可以回答,除非你提供一个 MCVE. SO expects 你为“1.Questions 寻求调试帮助("why isn't this code working?")”提供的 MCVE