从内核调用内核

时间:2012-07-31 19:10:24

标签: cuda

来自CUDA: Calling a __device__ function from a kernel

的后续问答

我正在尝试加快排序操作。下面是一个简化的伪版本:

// some costly swap operation
__device__ swap(float* ptrA, float* ptrB){
  float saveData;         // swap some 
  saveData= *Adata;       //   big complex
  *Adata= *Bdata          //     data chunk
  *Bdata= saveData;
}

// a rather simple sort operation
__global__ sort(float data[]){
  for (i=0; i<limit: i++){
  find left swap point
  find right swap point
  swap<<<1,1>>>(left, right);
  }
}

(注意:这个简单版本没有显示块中的缩减技术。)   这个想法是识别交换点很容易(快速)。交换操作成本高(慢)。因此,使用一个块来查找/识别交换点。使用其他块来执行交换操作。即实际交换并行。 这听起来像一个体面的计划。但是,如果编译器内联设备调用,则不会发生并行交换。 有没有办法告诉编译器不要在线设备调用?

2 个答案:

答案 0 :(得分:4)

编辑(2016):

动态并行性在第二代Kepler架构GPU中引入。计算能力3.5及更高版本的设备支持在设备中启动内核。


原始答案:

您必须等到下一代硬件可用的年底。目前没有CUDA设备可以从其他内核启动内核 - 目前它不受支持。

答案 1 :(得分:3)

我知道问这个问题已经有很长时间了。当我搜索同样的问题时,我到了这个页面。好像我得到了解决方案。

<强>解决方案:

我以某种方式到达了here并看到了从另一个内核中启动内核的很酷的方法。

__global__ void kernel_child(float *var1, int N){
    //do data operations here
}


__global__ void kernel_parent(float *var1, int N)
{
    kernel_child<<<1,2>>>(var1,N);
} 

cuda 5.0及以上版本的动态并行性使这成为可能。此外,在运行时请确保使用 compute_35架构或以上

终端方式 您可以从termial运行上面的父内核(最终将运行子内核)。在Linux机器上验证。

$ nvcc -arch=sm_35 -rdc=true yourFile.cu
$ ./a.out

希望它有所帮助。谢谢!