2017-09-27 10 views
0

私は、.cファイルと.cuファイルの2つ、nn.cuparallel.cuの3つのファイルで構成されています。主な機能は.cuファイル、nn.cuおよび.cファイル(utils.c)にあります。これはparallel.cuextern "C"です。 _Cilk_spawn_Cilk_syncで、私はさらに(cilkせずに完全に動作します)プログラムを並列化したいので、私はcilkみなさ:CilkとCUDAの組み合わせとコンパイル

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と一緒に、これらすべてをコンパイルしようとすると、問題がある:

$ 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". 

I _Cilk_spawnの2つの機能は、希望のCUDAカーネルを呼び出します。 nvccコマンドにパラメータ-lcilkrtsを追加しても、エラーは同じです。 また、コードの冒頭に#include "cilk/cilk.h"があります。

私を助けてもらえますか?なぜこれらのエラーが表示され、コンパイルされませんか? ありがとうございます!

答えて

1

コンパイルされない理由は、nvccはcilkの実装とキーワードをサポートしていないためです。 CilkコードからCUDA関数を呼び出すラッパーが必要です。ラッパーを記述し、それをあなたのシルクコードから呼び出す方法のサンプルは、cilk with cuda sampleです。

このリンクでは、cudaコードとcilkコードをコンパイルする方法と、それらをリンクする方法についても説明しています。

+0

私はこれを試します、ありがとう! – BabisI

関連する問題