编译 CUDA 时出错

Posted

技术标签:

【中文标题】编译 CUDA 时出错【英文标题】:Error compiling CUDA 【发布时间】:2013-08-16 18:56:11 【问题描述】:

我正在尝试编译一个 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 制作的 global 属性...

这是我的 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;

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

【问题讨论】:

@talonmies 谢谢!我没有你聪明。我从网站示例中复制了内核。不过非常感谢! ;) 【参考方案1】:

我想如果你做出这些改变:

__global__ void operate(int* memoria1, int* memoria2)
                         ^              ^

和:

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

您的代码将正确编译和运行。 你的结果会有点奇怪,因为代码实际上并没有初始化 CUDA 内核正在操作的 ac 的值。所以你可能想要初始化那些。

【讨论】:

【参考方案2】:

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

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

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

看起来像这样:

host.h

#include "iostream" #include "iomanip"

#include "device.h"

设备.h

全局 myCudeKernel();

由于某种原因,这导致了问题。最终将 device.h 标头移动到使用它的主文件并且没有问题。

【讨论】:

以上是关于编译 CUDA 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 CUDPPHandle 时出错

使用 Cuda 10.2 构建 OpenCV 2.4xx 时出错

将 ArrayFire 与 OpenCL 一起使用时出错

尝试验证安装时,首次安装 TensorFlow 会出错。 CUDA_ERROR_OUT_OF_MEMORY

py faster rcnn的lib编译出错问题

cuda编程问题 运行出错