在Pascal以上的Cuda中调用OpenGL glDispatchComputeIndirect()的简单序列链的最接近和有效的等价是什么?调度/内核链动态地改变启动参数大小(块/线程等)。
glDispatchComputeIndirect()可能只是一个驱动程序端的API调用开销优化而不是真正的设备端机制吗?
glDispatchComputeIndirect()是否等效于嵌套并行性,顶级内核为1个块,1个线程执行子内核调用序列?
__device__ int blocks = 1;
__device__ int threads = 1;
__global__ void Parent()
{
Child1<<<blocks, threads>>>(); // changes blocks/threads inside child
cudaDeviceSynchronize();
Child2<<<blocks, threads>>>(); // changes blocks/threads inside child
cudaDeviceSynchronize();
...
}
答案 0 :(得分:1)
glDispatchComputeIndirect()可能只是一个驱动程序端的API调用开销优化而不是真正的设备端机制吗?
几乎可以肯定。
glDispatchComputeIndirect()是否等效于嵌套并行性,顶级内核为1个块,1个线程执行子内核调用序列?
几乎肯定不会。
当然,您可以自由地使用动态并行作为此功能的代理。还可以使用映射内存或托管内存使GPU在内核启动之间回写到主机可访问内存。但据我所知,同样的“管道”式间接论证机制并不存在。