将 CUDA 代码与具有相互依赖性和外部变量的 C 代码链接起来
Linking CUDA code with C code with mutual dependency and extern variables
我有以下相互依赖的文件:
some_code_main.c
#include "utils.h"
#include "cmdline.h"
FILE log;
struct gengetopt_args_info args_info;
extern int abc;
int main(int argc, char *argv[]) {
initialize_files(&log, &error_log); // Some helper function
cmdline_parser(argc, argv, &args_info); // From cmdline.h
some_utility_function(); // From utils.h
cuda_function(); // From cuda_code.cu
}
utils.c
int abc;
extern FILE *LOG;
void some_utility_function() {
// Calculate abc.
fprintf(LOG, "abc is %d", abc);
}
cuda_code.cu
extern int abc; // From utils.c
extern struct gengetopt_args_info args_info;
extern FILE *LOG;
__global__ void some_kernel(char * input, int some_value, int dev_abc) {
// Process input.
}
void cuda_function() {
char * input;
char * dev_input;
cudaMalloc();
int some_value = args_info.some_value;
some_kernel<<<5, 5>>>( dev_input, some_value, abc );
cudaMemcpy( input, dev_input, some_size), cudaMemcpyDeviceToHost );
cudaFree()
fprintf(LOG, "%s", input);
}
所以some_code_main.c依赖于utils.c和cuda_code.cu; utils.c 取决于 some_code_main.c; cuda_code.c 取决于 some_code_main.c 和 utils.c。
如果没有这样的循环依赖,我知道我可以通过在 some_code_main.c 中为 cuda_function() 定义一个原型然后使用类似的东西来编译代码:
all:
some_code-mt
some_code-mt: cuda_code.o
g++ -o some_code utils.c some_code_main.c cuda_code.o
cuda_code.o:
nvcc -c cuda_code.cu
但是因为cuda_code.cu(用nvcc编译)需要some_code_main.c和utils.c(都是用g++编译)和some_code_main.c需要cuda-code.cu,如何确保满足所有依赖关系并且代码编译正确?
正如评论中所指出的,我只需要手动指定 CUDA 库和路径就可以了:
g++ -o some_code utils.c some_code_main.c cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -pthread
我有以下相互依赖的文件:
some_code_main.c
#include "utils.h"
#include "cmdline.h"
FILE log;
struct gengetopt_args_info args_info;
extern int abc;
int main(int argc, char *argv[]) {
initialize_files(&log, &error_log); // Some helper function
cmdline_parser(argc, argv, &args_info); // From cmdline.h
some_utility_function(); // From utils.h
cuda_function(); // From cuda_code.cu
}
utils.c
int abc;
extern FILE *LOG;
void some_utility_function() {
// Calculate abc.
fprintf(LOG, "abc is %d", abc);
}
cuda_code.cu
extern int abc; // From utils.c
extern struct gengetopt_args_info args_info;
extern FILE *LOG;
__global__ void some_kernel(char * input, int some_value, int dev_abc) {
// Process input.
}
void cuda_function() {
char * input;
char * dev_input;
cudaMalloc();
int some_value = args_info.some_value;
some_kernel<<<5, 5>>>( dev_input, some_value, abc );
cudaMemcpy( input, dev_input, some_size), cudaMemcpyDeviceToHost );
cudaFree()
fprintf(LOG, "%s", input);
}
所以some_code_main.c依赖于utils.c和cuda_code.cu; utils.c 取决于 some_code_main.c; cuda_code.c 取决于 some_code_main.c 和 utils.c。
如果没有这样的循环依赖,我知道我可以通过在 some_code_main.c 中为 cuda_function() 定义一个原型然后使用类似的东西来编译代码:
all:
some_code-mt
some_code-mt: cuda_code.o
g++ -o some_code utils.c some_code_main.c cuda_code.o
cuda_code.o:
nvcc -c cuda_code.cu
但是因为cuda_code.cu(用nvcc编译)需要some_code_main.c和utils.c(都是用g++编译)和some_code_main.c需要cuda-code.cu,如何确保满足所有依赖关系并且代码编译正确?
正如评论中所指出的,我只需要手动指定 CUDA 库和路径就可以了:
g++ -o some_code utils.c some_code_main.c cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -pthread