我在设备上计算一个数字X.现在我需要启动一个带有X线程的内核。我可以将blockSize设置为1024.有没有办法在不执行memcpy的情况下将块数设置为ceil(X / 1024)?
答案 0 :(得分:3)
我看到两种可能性:
使用动态并行(如果可行)。不是将结果复制回来确定下次启动的执行参数,而是让设备自己执行下一次启动。
使用零拷贝或托管内存。在这种情况下,GPU通过PCI-e总线直接写入CPU内存,而不需要显式内存传输。
在这些选项中,动态并行和托管内存需要所有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;
}