Как запустить ядро кооперативного шаблона cuda
Я безуспешно пытаюсь запустить ядро шаблона как совместное ядро в CUDA C++, что я делаю не так
ошибка
Error cannot determine which instance of function template "boolPrepareKernel" is intended
Я пытаюсь вызвать ядро, как показано ниже.
ForBoolKernelArgs<int> fbArgs = ...;
int device = 0;
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, device);
cudaLaunchCooperativeKernel((void*)boolPrepareKernel, deviceProp.multiProcessorCount, fFArgs.threads, fbArgs) ;
ядро определяется как
template <typename TYO>
__global__ void boolPrepareKernel(ForBoolKernelArgs<TYO> fbArgs) {
...
}
Я попытался параметризовать запуск (в этом примере с помощью int), например
cudaLaunchCooperativeKernel((void*)(<int>boolPrepareKernel), deviceProp.multiProcessorCount, fFArgs.threads, fbArgs) ;
но я получаю ошибку
no instance of overloaded function matches the argument list argument types are: (<error-type>, int, dim3, ForBoolKernelArgs<int>)
Для предложенного случая
cudaLaunchCooperativeKernel((void*)(boolPrepareKernel<int>), deviceProp.multiProcessorCount, fFArgs.threads, fbArgs)
Моя ошибка
no instance of overloaded function matches the argument list argument types are: (void *, int, dim3, ForBoolKernelArgs<int>)
Это, наверное, просто, но я застрял - спасибо за помощь!
Для эталонного запуска ядра, например
boolPrepareKernel << <fFArgs.blocks, fFArgs.threads >> > (fbArgs);
работает, но, конечно, синхронизация сетки недоступна.
1 ответ
Вот минимальный пример, который будет компилироваться:
$ cat t1954.cu
template <typename TYO>
struct ForBoolKernelArgs
{
TYO val;
};
template <typename TYO>
__global__ void boolPrepareKernel(ForBoolKernelArgs<TYO> fbArgs) {
}
int main(){
ForBoolKernelArgs<int> fbArgs;
void *kernel_args[] = {&fbArgs};
cudaLaunchCooperativeKernel((void*)(boolPrepareKernel<int>), 1, 1, kernel_args) ;
}
$ nvcc -o t1954 t1954.cu
$
Вероятно, основная оставшаяся проблема заключается в том, что вы не следуете надлежащим инструкциям по передаче аргументов ядра.