C++ 从全局内核调用主机函数
我试图从内核调用一个函数,但总是出错。我的函数是一个模板参数。 以下是错误:C++ 从全局内核调用主机函数,c++,templates,cuda,C++,Templates,Cuda,我试图从内核调用一个函数,但总是出错。我的函数是一个模板参数。 以下是错误: calling a __host__ function("mul<int> ") from a __global__ function("multiply<int, &mul<int> > ") is not allowed. 不允许从全局函数(“乘法”)调用主机函数(“mul”)。 这是我的密码: template<typename T> T m
calling a __host__ function("mul<int> ") from a __global__ function("multiply<int, &mul<int> > ") is not allowed.
不允许从全局函数(“乘法”)调用主机函数(“mul”)。
这是我的密码:
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>>>(...);
}
模板T mul(T a,T b)
{
返回a*b;
}
模板
静态\uuu全局\uuuu无效乘法(int*in,int*out)
{...
a=myop(b,c);
...
}
int main()
{
乘(…);
}
有人知道发生了什么吗 拟用于设备代码的功能必须具有
\uuuu device\uuuu
:
$cat t1018.cu
#包括
模板
__主机设备多路复用器(TA、TB)
{
返回a*b;
}
模板
静态\uuuu全局\uuuuu无效乘法()
{
tb=2;
tc=5;
T a=myop(b,c);
printf(“a=%d\n”,a);
}
int main()
{
乘法();
cudaDeviceSynchronize();
}
$nvcc-o t1018 t1018.cu
美元/t1018
a=10
$
拟在设备代码中使用的功能必须具有\uuuuu设备\uuuu
:
$cat t1018.cu
#包括
模板
__主机设备多路复用器(TA、TB)
{
返回a*b;
}
模板
静态\uuuu全局\uuuuu无效乘法()
{
tb=2;
tc=5;
T a=myop(b,c);
printf(“a=%d\n”,a);
}
int main()
{
乘法();
cudaDeviceSynchronize();
}
$nvcc-o t1018 t1018.cu
美元/t1018
a=10
$
我有一个问题,你为什么要添加_uu主机_u?\uuu设备还不够好?例如,\uu设备
就足够好了。我添加了\uuuuu host\uuuuuu
,因为根据您最初的示例,它是一个主机函数,在您的实际代码中,您可能也在主机代码的其他地方使用了它(您没有显示)。通过添加\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu主机
限定符,我们不会破坏这种用法(如果您也可能以这种方式使用它)。但是对于这个例子,你可以删除\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
设备还不够好?例如,\uu设备
就足够好了。我添加了\uuuuu host\uuuuuu
,因为根据您最初的示例,它是一个主机函数,在您的实际代码中,您可能也在主机代码的其他地方使用了它(您没有显示)。通过添加\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu主机
限定符,我们不会破坏这种用法(如果您也可能以这种方式使用它)。但就本例的范围而言,您可以删除\uuuuuuu主机
。
$ 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
$