【问题标题】:can different calls to kernel share memory?对内核的不同调用可以共享内存吗?
【发布时间】:2013-11-17 05:03:13
【问题描述】:

在我的代码中,我需要调用一个 CUDA 内核来并行化一些矩阵计算。然而,这个计算必须迭代完成约 60,000 次(内核在 60,000 次循环迭代中被调用)。

这意味着,如果我在每次调用内核时都执行 cudaMalloc/cudaMemcpy,那么大部分时间将花费在内存分配和传输上,并且我的速度会明显变慢。

有没有办法说,在for循环之前分配一块内存,在内核的每次迭代中使用该内存,然后在for循环之后,将该内存从设备复制回主机?

谢谢。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    是的,您完全可以按照您的描述进行操作:

    int *h_data, *d_data;
    cudaMalloc((void **)&d_data, DSIZE*sizeof(int));
    h_data = (int *)malloc(DSIZE*sizeof(int));
    // fill up h_data[] with data
    cudaMemcpy(d_data, h_data, DSIZE*sizeof(int), cudaMemcpyHostToDevice);
    for (int i = 0; i < 60000; i++)
      my_kernel<<<grid_dim, block_dim>>>(d_data)
    cudaMemcpy(h_data, d_data, DSIZE*sizeof(int), cudaMemcpyDeviceToHost);
    ...
    

    【讨论】:

    • malloc() 替换为cudaMallocHost() 可能会提高性能。
    • 谢谢!这正是我需要做的。但我不确定,因为我必须在循环中使用 CUDA 计算的结果做其他有用的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2017-06-21
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多