【问题标题】:Linking CUDA code with C code with mutual dependency and extern variables将 CUDA 代码与具有相互依赖关系和外部变量的 C 代码链接起来
【发布时间】:2020-04-02 08:06:30
【问题描述】:

我有以下相互依赖的文件:

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 库和 gcc 的路径,以便链接成功,并注意使用 g++ 编译 C 代码的符号修饰。

标签: c cuda g++ circular-dependency nvcc


【解决方案1】:

正如评论中指出的,我只需要手动指定 CUDA 库和路径就可以了:

g++ -o some_code utils.c some_code_main.c cuda_code.o -L/usr/local/cuda-10.0/lib64 -lcudart -pthread

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多