使用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
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