如果块数取决于设备变量,如何避免memcpy?

时间:2016-04-26 12:04:04

标签: cuda

我在设备上计算一个数字X.现在我需要启动一个带有X线程的内核。我可以将blockSize设置为1024.有没有办法在不执行memcpy的情况下将块数设置为ceil(X / 1024)?

2 个答案:

答案 0 :(得分:3)

我看到两种可能性:

  1. 使用动态并行(如果可行)。不是将结果复制回来确定下次启动的执行参数,而是让设备自己执行下一次启动。

  2. 使用零拷贝或托管内存。在这种情况下,GPU通过PCI-e总线直接写入CPU内存,而不需要显式内存传输。

  3. 在这些选项中,动态并行和托管内存需要所有GPU都不具备的硬件功能。所有具有计算能力> = 1.1的GPU都支持零拷贝存储器,这实际上几乎与所有CUDA兼容设备有关。

答案 1 :(得分:1)

@talonmies概述的使用托管内存的示例,允许kernel1在没有明确memcpy的情况下确定kernel2的块数。

#include <stdio.h>
#include <cuda.h>

using namespace std;

__device__ __managed__ int kernel2_blocks;

__global__ void kernel1() {
    if (threadIdx.x == 0) {
        kernel2_blocks = 42;
    }
}

__global__ void kernel2() {
    if (threadIdx.x == 0) {
        printf("block: %d\n", blockIdx.x);
    }
}

int main() {
    kernel1<<<1, 1024>>>();
    cudaDeviceSynchronize();
    kernel2<<<kernel2_blocks, 1024>>>();
    cudaDeviceSynchronize();
    return 0;
}