gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:43:34 27 4
gpt4 key购买 nike

我在 CUDA 编程方面遇到问题!输入是矩阵 A( 2 x 2 )输出是一个矩阵 A( 2 x 2 ),每个新值都是 **旧值的 3 指数 **例子 :输入: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架构或更高版本上

为什么我错了?如何修复呢?

最佳答案

这个错误是相当有解释性的。用 __global__ 修饰的 CUDA 函数代表一个内核。内核可以从主机代码启动。在 cc 3.5 或更高版本的 GPU 上,您还可以从设备代码启动内核。因此,如果您从设备代码(即从用 __global____device__ 修饰的另一个 CUDA 函数)调用 __global__ 函数,那么您必须编译适当的架构。这称为 CUDA 动态并行性,您应该read the documentation如果您想使用它,请学习如何使用它。

当您启动内核时,无论是从主机还是设备代码,您都必须提供启动配置,即三重 V 形符号之间的信息:

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__ 修饰的函数不是内核(因此它们不能直接从主机代码调用),但可以直接从任何体系结构上的设备代码调用。 programming guide也将有助于解释差异。

关于function - CUDA C++ 中的一个函数调用另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23346305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com