c++ - 从全局内核调用宿主函数

标签 c++ templates cuda

我试图从内核中调用一个函数,但我不断收到错误。我的函数是一个模板参数。 这是错误:

 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__ qualifier :

$ 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 = %d\n", a);

}
int main()
{
  multiply<int, mul<int> ><<<1, 1>>>();
  cudaDeviceSynchronize();
}
$ nvcc -o t1018 t1018.cu
$ ./t1018
a = 10
$

关于c++ - 从全局内核调用宿主函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561797/

相关文章:

c++ - 为处理器执行除法和取模的最佳方法是什么?

c++ - 为什么我需要重新声明部分模板特化的方法/成员?

c++ - 优化具有不规则内存访问的 CUDA 内核

python - django 模板 : how to expand a variable into the string argument for the built-in tag `url`

bash - 使用 bash 脚本从模板创建新文件

multithreading - CUDA统一内存可以被另一个CPU线程写入吗?

visual-c++ - CUFFT - 填充/初始化问题

c++ - 使用专用和非专用类型的模板重载

c++ - 什么数据结构更适合用于存储和排序<int, int>结构?

c++ - 在堆栈上抛出对象异常,new 内存泄漏?