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