【问题标题】:cannot compile the CUDA code when splitted into several files拆分为多个文件时无法编译 CUDA 代码
【发布时间】:2021-03-03 07:00:22
【问题描述】:

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

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

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);

我认为无论错误是什么,它应该是一个非常小的错误。但是我找不到。

【问题讨论】:

  • .c.cpp 结尾的文件主要由您的主机编译器处理。您的主机编译器不理解 CUDA 语法。由于您打算从master.c 文件中调用内核,可能最简单的选择是将该文件重命名为master.cu 这是包含CUDA 语法的代码的通常建议:它应该在.cu 文件中。这将影响到您的read_data.c 文件的链接过程,因此最简单的选项可能是将其重命名为read_data.cppread_data.cu。您也可以尝试仅将 -x cu 文件作为编译开关传递,而不更改文件。
  • @RobertCrovella 谢谢!那行得通!如果您想将此添加为答案,我可以将其标记为正确答案。

标签: c cuda nvcc


【解决方案1】:

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

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

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

cuda 标签上有很多问题解释了如何进行 C++/C 链接,否则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 2014-03-12
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2018-09-13
    相关资源
    最近更新 更多