CUDA C++中的一个函数调用另一个函数

3
我有一个CUDA编程的问题!输入是一个2x2的矩阵A,输出是每个新值都是旧值的3次方的2x2矩阵A。例如: 输入:A:{2,2} 输出:A {8,8}               {2,2}               {8,8}
我在CudaCode.CU文件中有2个函数:
   __global__ void Power_of_02(int &a)
{
    a=a*a;
}

 //***************
__global__ void Power_of_03(int &a)
{
    int tempt = a;
    Power_of_02(a); //a=a^2;
    a= a*tempt; // a = a^3
}

操作系统内核:

__global__ void CudaProcessingKernel(int *dataA )    //kernel function  

   {  
        int bx = blockIdx.x;  
    int tx = threadIdx.x;  
        int tid = bx * XTHREADS + tx;  

    if(tid < 16)
    {
    Power_of_03(dataA[tid]);
        }
    __syncthreads();

   }  

我认为代码是正确的,但出现了错误:从一个__global__函数("Power_of_03")调用另一个__global__函数("Power_of_02")只允许在compute_35架构及以上

为什么会出错?如何修复它?

1个回答

6
错误信息是相当清晰的。带有__global__修饰符的CUDA函数表示一个内核,内核可以从主机代码启动。在cc 3.5或更高版本的GPU上,您还可以从设备代码启动内核。因此,如果您从设备代码(即从另一个使用__global____device__修饰符的CUDA函数)调用一个__global__函数,则必须为适当的架构进行编译。这称为CUDA动态并行性,如果您想要使用它,应该阅读文档以了解如何使用它。
当您从主机或设备代码启动内核时,必须提供启动配置,即三重箭头符号之间的信息:
CudaProcessingKernel<<<grid, threads>>>(d_A);

如果你想从另一个内核中使用你的2次幂代码,你需要以类似而适当的方式调用它。
然而,根据你的代码结构,似乎你可以通过将你的2次幂和3次幂函数声明为`__device__`函数来使其正常工作。
   __device__ void Power_of_02(int &a)
{
    a=a*a;
}

 //***************
__device__ void Power_of_03(int &a)
{
    int tempt = a;
    Power_of_02(a); //a=a^2;
    a= a*tempt; // a = a^3
}

这可能适用于您,也许是您的意图。被装饰为__device__的函数不是内核函数(因此不能直接从主机代码调用),但可以在任何架构上直接从设备代码调用。 编程指南也有助于解释其中的区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接