Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从全局内核调用主机函数_C++_Templates_Cuda - Fatal编程技术网

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
$