首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cilk与CUDA的结合与编译

Cilk与CUDA的结合与编译
EN

Stack Overflow用户
提问于 2017-09-27 12:50:08
回答 1查看 111关注 0票数 0

我有一个程序,其中包括3个文件,一个.c文件和两个.cu文件,nn.cuparallel.cu。main函数位于一个.cu文件、nn.cu.c文件(utils.c)中,我将其作为extern "C"放在parallel.cu中。我想进一步并行化这个程序(它在没有cilk的情况下也能很好地运行),所以我考虑使用cilk,使用_Cilk_spawn_Cilk_sync

代码语言:javascript
复制
int main(int argc, char* argv[] ) {

    clock_t begin = clock();

    srand((unsigned)time(NULL));

    int n_inputs = atoi(argv[2]);
    int n_hidden = atoi(argv[3]);
    int n_outputs = atoi(argv[4]);

    // Build output layer
    NeuralNet nn = buildNeuralNet(n_inputs, n_outputs, n_hidden);

    // Build training samples
    int _p1[] = {0,0};
    Pattern p1 = makePatternSingleOutput(_p1, 0);
    int _p2[] = {0,1};
    Pattern p2 = makePatternSingleOutput(_p2, 1);
    int _p3[] = {1,1};
    Pattern p3 = makePatternSingleOutput(_p3, 1);
    int _p4[] = {1,0};
    Pattern p4 = makePatternSingleOutput(_p4, 1);

    Pattern patterns[] = {p3, p2, p1, p4};

    // Train the network
    _Cilk_spawn train_network(patterns, 4, atoi(argv[1]), nn);

    printf("\n\nTesting the network\n");

    _Cilk_sync;

    _Cilk_spawn update_pattern(p2, nn);
    for (int i=0; i < nn.n_outputs; i++) {
        printf("Output: %f, expected: %i\n", nn.out_output[i], p2.result[i]);
        printf("NN Error : %f\n", 1.0f - nn.out_output[i]);
    }
    cudaDeviceReset();

    _Cilk_sync;

    clock_t end = clock();
    double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("Runtime : %f\n", time_spent);

    return 0;

}

问题是,当我尝试用nvcc将所有这些都编译在一起时

代码语言:javascript
复制
$ nvcc -Wno-deprecated-gpu-targets -o my_nn_cilk nn.cu parallel.cu -lm
nn.cu(241): error: identifier "_Cilk_spawn" is undefined

nn.cu(241): error: expected a ")"

nn.cu(245): error: identifier "_Cilk_sync" is undefined

nn.cu(247): error: identifier "_Cilk_spawn" is undefined

nn.cu(247): error: expected a ")"

5 errors detected in the compilation of "/tmp/tmpxft_00003b52_00000000-14_nn.cpp1.ii".

_Cilk_spawn调用的两个函数是所需的CUDA内核。即使我将参数-lcilkrts添加到nvcc命令中,错误也是一样的。此外,我在代码的开头使用了#include "cilk/cilk.h"

你能帮帮我吗?为什么它会显示这些错误,而不能编译?提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2017-09-27 18:39:11

它不编译的原因是,nvcc不支持cilk实现和关键字。您需要一个包装器来调用cilk代码中的CUDA函数。下面是一个示例,说明如何编写包装器并从您的cilk代码中调用它:cilk with cuda sample

在链接中,还解释了如何编译cuda代码和cilk代码以及如何链接它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46439725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档