【发布时间】: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.cpp或read_data.cu。您也可以尝试仅将-x cu文件作为编译开关传递,而不更改文件。 -
@RobertCrovella 谢谢!那行得通!如果您想将此添加为答案,我可以将其标记为正确答案。