拆分为多个文件时无法编译 CUDA 代码

cannot compile the CUDA code when splitted into several files

我正在编写这个简单的 cuda 代码,但我无法编译它。该代码包含部分用C编写的代码。这是程序的结构:

read_data.c 文件包含一个名为 read_data 的函数 add.cu 文件包含一个名为 add 的函数(这是 GPGPU 中应该 运行 的部分) optimize.h 文件包含必要的 headers。 master.c 文件包含主要功能。

optimize.h 文件如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>

__global__ void add(int, float*, float*);
void read_data(char*, float**, float**, int**);

master.c 文件如下所示:

#include "optimize.h"

int main(){
    char* path = "./data/0";
    float* base_load;
    float* comfortable_temperatures;
    int* comfort_index;

    read_data(path, &base_load, &comfortable_temperatures, &comfort_index);
    int N = 1<<20;
    float *x, *y;
    int i;

    cudaMallocManaged(&x, N*sizeof(float));
    cudaMallocManaged(&y, N*sizeof(float));
  
    for (i = 0; i < N; i++) {
       x[i] = 1.0f;
       y[i] = 2.0f;
    }
    add<<<1, 256>>>(N, x, y);

    cudaDeviceSynchronize();

    // still need to read the result back.

    cudaFree(x);
    cudaFree(y);
   }

我使用以下行编译了它:

nvcc -o master master.c read_data.c add.cu

我收到了这个错误:

In file included from master.c:1:0:
optimize.h:9:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
 __global__ void add(int, float*, float*);
            ^
master.c: In function ‘main’:
master.c:51:26: error: ‘add’ undeclared (first use in this function)
                          add<<<1, 256>>>(N, x, y);
                          ^
master.c:51:26: note: each undeclared identifier is reported only once for each function it appears in
master.c:51:31: error: expected expression before ‘<’ token
                          add<<<1, 256>>>(N, x, y);

我觉得不管是什么错误,应该是很小的一个。但是我找不到。

nvcc 默认情况下将以 .c.cpp 结尾的文件名视为没有特定于 CUDA 的语法,并将它们发送到主机编译器。主机编译器无法处理特定于 CUDA 的语法,这就是您收到错误的原因。

通常的建议是将您的 CUDA 代码放在以 .cu 结尾的文件中。您也可以通过 -x cu 作为编译开关来执行此操作。

请注意 nvcc 使用 c++ 风格 linkage,因此如果您尝试 link 代码,则需要安排正确的 c 风格 linkage在 .cu 文件中,代码在 .c 文件中。如果您没有特定于 C 的用法,同样,一个简单的解决方案可能是将您的 .c 文件重命名为 .cpp.cu.

cuda 标签上有很多问题解释如何做 C++/C linkage,否则。