CUDA-多核 void func(){ 整块大小、网格大小; 块大小=32; 网格大小=16; gpu内核1(x,y); gpu内核2(x,y); gpu_内核3(x,y); gpu内核4(x,y); }

CUDA-多核 void func(){ 整块大小、网格大小; 块大小=32; 网格大小=16; gpu内核1(x,y); gpu内核2(x,y); gpu_内核3(x,y); gpu内核4(x,y); },cuda,gpu,Cuda,Gpu,这是我的cuda脚本示例,在这种情况下, gpu_内核1、gpu_内核2、gpu_内核3、gpu_内核4是否同时执行 我想在gpu内核1完全完成后执行gpu内核2。我该怎么做呢?虽然对许多CUDA函数的调用是异步的(即CPU代码不会等到特定的事情完成后才继续执行到下一个),例如内核调用,但这并不意味着异步调用的所有事情都会同时发生(事实上,即使单个内核调用也不是同时进行的,它们被划分为块等) 异步调用基本上是一条指令,让其他人开始执行某项操作,而调用该指令的过程并不等待该指令完成。在CUDA中,

这是我的cuda脚本示例,在这种情况下, gpu_内核1、gpu_内核2、gpu_内核3、gpu_内核4是否同时执行


我想在gpu内核1完全完成后执行gpu内核2。我该怎么做呢?

虽然对许多CUDA函数的调用是异步的(即CPU代码不会等到特定的事情完成后才继续执行到下一个),例如内核调用,但这并不意味着异步调用的所有事情都会同时发生(事实上,即使单个内核调用也不是同时进行的,它们被划分为块等)

异步调用基本上是一条指令,让其他人开始执行某项操作,而调用该指令的过程并不等待该指令完成。在CUDA中,“其他人”就是GPU。如果不这样做,GPU将有自己的“主线程”,或CUDA术语中的默认流,在该流中事物将排队。此主线程中的指令将依次排队

在您的情况下,您的CPU将对所有4个内核进行中间排队,但它们不会并行执行,它们将进入默认流,并由GPU按顺序排队执行,即使CPU没有等待它们,并且已经开始执行其他操作。因此,要回答您的问题:您已经在执行
GPU内核2
gpu\U内核1


现在,为了回答相反的问题,如果你想一起执行内核,你需要为GPU中的每个“线程”创建你自己的流,然后调用这些流上的内核。这变得更加复杂,因为有些指令可以这样做,有些则不能(多个内存拷贝,内核占用所有SM,等等),但阅读CUDA中的流将是正确的起点。

由于您没有指定流,它们都应该在默认流上运行,因此不会并行运行。
void func(){
int block_size, grid_size;

block_size = 32;
grid_size = 16;

gpu_kernel1<<<grid_size, block_size>>>(x,y);
gpu_kernel2<<<grid_size, block_size>>>(x,y);
gpu_kernel3<<<grid_size, block_size>>>(x,y);
gpu_kernel4<<<grid_size, block_size>>>(x,y);
}