拆分为多个文件时无法编译 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,否则。
我正在编写这个简单的 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,否则。