使用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-假设我已经使用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
- C++尝试深度复制唯一指针时出现内存访问冲突
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- CRTP - 危险的内存访问?
- C++ Python 的扩展 - 安全内存访问和内存布局
- 在Visual Studio中查找非法内存访问
- C++内存访问违反内存大块
- 数组中未映射的内存访问从python传递到c++
- 使用加速进程间创建消息队列 - 内存访问冲突
- C 指针转换会导致内存访问冲突
- 为什么代码会抛出非法内存访问错误
- 多线程环境中C++内存访问
- CUDA 中的递归返回非法内存访问
- 为什么创建进程 API 调用会导致内存访问冲突?
- 在 C++ 中遍历链表比在具有类似内存访问的 Go 中慢
- 确定打开进程的内存访问位置
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- 指向结构的指针的 2D 数组.内存访问问题
- GPU 内存访问和使用 (CUDA)
- 在实时程序中是动态内存访问有害的
- 随机 mmaped 内存访问比堆数据访问慢 16%