Cuda 如何使内核函数既可从主机调用又可从设备调用?

Cuda 如何使内核函数既可从主机调用又可从设备调用?,cuda,Cuda,以下试验表明了我的意图,但未能编译: __host__ __device__ void f(){} int main() { f<<<1,1>>>(); } 希望我的陈述清晰明了,感谢您的建议。您需要创建一个CUDA内核入口点,例如\uuuuu global\uuu函数。比如: #include <stdio.h> __host__ __device__ void f() { #ifdef __CUDA_ARCH__ prin

以下试验表明了我的意图,但未能编译:

__host__ __device__ void f(){}

int main()
{
    f<<<1,1>>>();
}

希望我的陈述清晰明了,感谢您的建议。

您需要创建一个CUDA内核入口点,例如
\uuuuu global\uuu
函数。比如:

#include <stdio.h>

__host__ __device__ void f() {
#ifdef __CUDA_ARCH__
    printf ("Device Thread %d\n", threadIdx.x);
#else
    printf ("Host code!\n");
#endif
}

__global__ void kernel() {
   f();
}

int main() {
   kernel<<<1,1>>>();
   if (cudaDeviceSynchronize() != cudaSuccess) {
       fprintf (stderr, "Cuda call failed\n");
   }
   f();
   return 0;
}
#包括
__主机\设备\无效f(){
#ifdef_uuucuda_u拱门__
printf(“设备线程%d\n”,threadIdx.x);
#否则
printf(“主机代码!\n”);
#恩迪夫
}
__全局无效内核(){
f();
}
int main(){
内核();
如果(cudaDeviceSynchronize()!=cudaSuccess){
fprintf(stderr,“Cuda调用失败\n”);
}
f();
返回0;
}

你正在看的教程太旧了,2008年?它可能与您正在使用的CUDA版本不兼容

您可以使用
\uuuuu global\uuuuuu
,这意味着
\uuuu主机\uuuuuuuuu设备\uuuuuuuu
,其工作原理如下:

__global__ void f()
{
    const int tid = threadIdx.x + blockIdx.x * blockDim.x;
}

int main()
{
    f<<<1,1>>>();
}
\uuuuu全局\uuuuu无效f()
{
const int tid=threadIdx.x+blockIdx.x*blockDim.x;
}
int main()
{
f();
}

你的意思肯定是
\uuuuu设备\uuuuuu主机\uuuuuuuuuuu无效f(){}
?我尝试了“设备主机”和“主机设备”的组合,但都失败了上述代码基于教程“
\uuuu全局\uuuuuuuuuuu
指定了一个内核入口点,即当使用启动参数调用时将自动并行化为GPU代码的函数<代码>\uuuuuuuuuuuuuuuu主机和
\uuuuuuu设备
不用于修饰内核函数。您可以说
\uuuuu global\uuuuu
的唯一含义是
\uuuu主机\uuuuuuuuuu设备\uuuuuuuu
具有任何含义,它仅在cc 3.5设备上可用。即使在这种情况下,我认为说
\uuuuu global\uuuuuu
意味着
\uuuuu host\uuuuuuuuuu device\uuuuuuuuuuu
@RobertCrovella是草率的,我同意,我的意思是它们在他的上下文中是等价的,因为我的代码无论如何都不能从主机调用,因为它有内核变量。在此上下文中,预编译器代码没有任何意义。。。
__global__ void f()
{
    const int tid = threadIdx.x + blockIdx.x * blockDim.x;
}

int main()
{
    f<<<1,1>>>();
}