编译CUDA时出错

编译CUDA时出错,c,gcc,compiler-construction,cuda,nvcc,C,Gcc,Compiler Construction,Cuda,Nvcc,我试图编译一个C程序来尝试并行编程,当我试图用nvcc编译器(Nvidia)编译它时,它会给我以下错误: inicis.cu(3): error: attribute "global" does not apply here inicis.cu(3): error: incomplete type is not allowed inicis.cu(3): error: identifier "a" is undefined inicis.cu(3): error: expected a "

我试图编译一个C程序来尝试并行编程,当我试图用nvcc编译器(Nvidia)编译它时,它会给我以下错误:

inicis.cu(3): error: attribute "global" does not apply here

inicis.cu(3): error: incomplete type is not allowed

inicis.cu(3): error: identifier "a" is undefined

inicis.cu(3): error: expected a ")"

inicis.cu(4): error: expected a ";"

/usr/include/_locale.h(68): error: expected a declaration

inicis.cu(20): error: type name is not allowed

inicis.cu(21): error: type name is not allowed

inicis.cu(22): error: type name is not allowed

inicis.cu(41): error: identifier "dev_a" is undefined

inicis.cu(42): error: identifier "dev_b" is undefined

inicis.cu(43): error: identifier "dev_c" is undefined
似乎nvcc不认识Nvidia制作的全局属性

这是我的C程序,非常简单:

__global__ void operate(*memoria1, *memoria2)
{
    memoria2[threadIdx.x] = memoria1[threadIdx.x] + 1;
}


int main(int args, char **argv){

    int a[5], c[5];
    int *memory_1, *memory_2;

    cudaMalloc(void** &memory_1, 5 * sizeof(int));
    cudaMalloc(void** &memory_2, 5 * sizeof(int));

    cudaMemcpy(memory_1, a, 5 * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(memory_2, c, 5 * sizeof(int), cudaMemcpyHostToDevice);

    operate <<<1, 5>>>(memory_1, memory_2);

    cudaMemcpy(c, memory_2, 5 * sizeof(int), cudaMemcpyDeviceToHost);

    for (int i = 0; i < sizeof(c); ++i)
    {
        printf ("%d" , c[i]);
    }

    cudaFree(memory_1);
    cudaFree(memory_2);

    return 0;
}
\uuuuu全局\uuuuuuu无效操作(*内存1,*内存2)
{
memoria2[threadIdx.x]=memoria1[threadIdx.x]+1;
}
int main(int参数,字符**argv){
int a[5],c[5];
int*memory_1,*memory_2;
cudamaloc(void**&memory_1,5*sizeof(int));
cudamaloc(void**&memory_2,5*sizeof(int));
cudaMemcpy(内存1,a,5*sizeof(int),cudamemcpyhostodevice);
cudaMemcpy(内存2,c,5*sizeof(int),cudamemcpyhostodevice);
操作(存储器1、存储器2);
cudaMemcpy(c,内存2,5*sizeof(int),cudaMemcpyDeviceToHost);
对于(int i=0;i

我认为可能是编译器,但您认为会是什么?

我认为如果您进行以下更改:

__global__ void operate(int* memoria1, int* memoria2)
                         ^              ^
以及:

您的代码将正确编译和运行。
您的结果会有点奇怪,因为代码实际上并没有初始化CUDA内核正在操作的
a
c
的值。因此,您可能需要初始化它们。

我认为如果您进行以下更改:

__global__ void operate(int* memoria1, int* memoria2)
                         ^              ^
以及:

您的代码将正确编译和运行。 您的结果会有点奇怪,因为代码实际上并没有初始化CUDA内核正在操作的
a
c
的值。因此,您可能需要初始化它们。

TL:DR 内核声明位于错误的位置,编译器将其视为变量。您需要确保内核声明位于使用它的.cu文件中。如果它需要首先在使用它的文件中声明,而只是乱弄它的声明点,则不是100

我的cuda代码也有同样的问题。 问题是我在错误的地方声明了我的内核。我会详细说明的

我的main有一个名为host.h的头文件,其中保存了我使用的所有头文件以及我的项目方法声明。在这里,我还添加了cuda运行时的头文件以及声明内核的device.h文件

看起来像这样:

主持人:h

#包括“iostream” #包括“iomanip”

#包括“device.h”

设备.h

globalmyCudeKernel()

这是因为某种原因造成的问题。最终将device.h头移动到使用它的主文件,没有问题。

TL:DR 内核声明位于错误的位置,编译器将其视为变量。您需要确保内核声明位于使用它的.cu文件中。如果它需要首先在使用它的文件中声明,而只是乱弄它的声明点,则不是100

我的cuda代码也有同样的问题。 问题是我在错误的地方声明了我的内核。我会详细说明的

我的main有一个名为host.h的头文件,其中保存了我使用的所有头文件以及我的项目方法声明。在这里,我还添加了cuda运行时的头文件以及声明内核的device.h文件

看起来像这样:

主持人:h

#包括“iostream” #包括“iomanip”

#包括“device.h”

设备.h

globalmyCudeKernel()


这是因为某种原因造成的问题。最终将device.h头移动到使用它的主文件,没有问题。

@talonmies谢谢!我没有你聪明。我从一个网站示例中复制了内核。但是非常感谢!;)@塔龙,谢谢!我没有你聪明。我从一个网站示例中复制了内核。但是非常感谢!;)