从全局内核调用主机函数

calling a host function from a global kernel

本文关键字:主机 函数 调用 内核 全局      更新时间:2023-10-16

我正试图从内核调用一个函数,但我一直收到错误。我的函数是一个模板参数。错误如下:

 calling a __host__ function("mul<int> ") from a __global__ function("multiply<int, &mul<int> > ") is not allowed. 

这是我的代码:

    template<typename T> T mul(T a, T b)
{
    return a * b;
}
template <typename T, T (*myop)(T, T)>
static __global__ void multiply(int *in, int *out)
{...
 a = myop(b, c);
 ...
}
int main()
{
multiply<T, mul<T> ><<<Blocks, 1024>>>(...);
}

有人知道发生了什么事吗?

打算在设备代码中使用的函数必须具有__device__限定符:

$ cat t1018.cu
#include <stdio.h>
template<typename T>
__host__ __device__ T mul(T a, T b)
{
    return a * b;
}
template <typename T, T (*myop)(T, T) >
static __global__ void multiply()
{
 T b=2;
 T c=5;
 T a = myop(b, c);
 printf("a = %dn", a);
}
int main()
{
  multiply<int, mul<int> ><<<1, 1>>>();
  cudaDeviceSynchronize();
}
$ nvcc -o t1018 t1018.cu
$ ./t1018
a = 10
$