小编pmc*_*mcr的帖子

CUDA流不重叠

我有一些非常类似的代码:

int k, no_streams = 4;
cudaStream_t stream[no_streams];
for(k = 0; k < no_streams; k++) cudaStreamCreate(&stream[k]);

cudaMalloc(&g_in,  size1*no_streams);
cudaMalloc(&g_out, size2*no_streams);

for (k = 0; k < no_streams; k++)
  cudaMemcpyAsync(g_in+k*size1/sizeof(float), h_ptr_in[k], size1, cudaMemcpyHostToDevice, stream[k]);

for (k = 0; k < no_streams; k++)
  mykernel<<<dimGrid, dimBlock, 0, stream[k]>>>(g_in+k*size1/sizeof(float), g_out+k*size2/sizeof(float));

for (k = 0; k < no_streams; k++)
  cudaMemcpyAsync(h_ptr_out[k], g_out+k*size2/sizeof(float), size2, cudaMemcpyDeviceToHost, stream[k]);

cudaThreadSynchronize();

cudaFree(g_in);
cudaFree(g_out);
Run Code Online (Sandbox Code Playgroud)

'h_ptr_in'和'h_ptr_out'是用cudaMallocHost分配的指针数组(没有标志).

问题是流不重叠.在可视化分析器中,我可以看到第一个流中的内核执行与第二个流中的副本(H2D)重叠,但没有其他重叠.

我可能没有资源来运行2个内核(我想我这样做)但至少内核执行和副本应该重叠,对吧?如果我把所有3(复制H2D,内核执行,复制D2H)放在同一个for循环中,它们之间没有任何重叠......

请帮忙,这可能导致什么?

我正在跑步:

Ubuntu 10.04 x64

设备:"GeForce GTX 460"(CUDA驱动程序版本:3.20,CUDA运行时版本:3.20,CUDA能力主要/次要版本号:2.1,并发复制和执行:是,并发内核执行:是)

cuda cuda-streams

10
推荐指数
1
解决办法
3779
查看次数

CUDA设备指针操作

我用过:

float *devptr;
//...
cudaMalloc(&devptr, sizeofarray);
cudaMemcpy(devptr, hostptr, sizeofarray, cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

在CUDA C中分配和填充数组.现在我正在尝试运行cuda内核,例如:

__global__ void kernelname(float *ptr)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

在该数组中但具有偏移值.在C/C++中,它会像这样:

kernelname<<<dimGrid, dimBlock>>>(devptr+offset);
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.

有没有办法在没有将偏移值发送到单独的参数中的内核并在内核代码中使用该偏移量的情况下执行此操作?关于如何做到这一点的任何想法?

pointers cuda

3
推荐指数
1
解决办法
9221
查看次数

标签 统计

cuda ×2

cuda-streams ×1

pointers ×1