使用cuda直接全局内存访问

direct global memory access using cuda

本文关键字:内存 访问 全局 cuda 使用      更新时间:2023-10-16

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-假设我已经使用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,否则这个问题是无法回答的。SO希望您为"1.寻求调试帮助的问题("为什么此代码不起作用?"("提供MCVE