2017-09-27 3 views
0

Ich habe ein Programm, das aus 3 Dateien besteht, eine .c Datei und zwei .cu Dateien, nn.cu und parallel.cu. Die Hauptfunktion befindet sich in der Datei .cu, die nn.cu und die .c Datei (utils.c) Ich habe es als extern "C" in der parallel.cu. Ich möchte das Programm weiter parallelisieren (die perfekt läuft ohne cilk), so dass ich als cilk, mit _Cilk_spawn und _Cilk_sync:Cilk und CUDA Kombination und Kompilierung

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; 

} 

Das Problem ist, wenn ich versuche, diese alle zusammen zu kompilieren mit 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". 

Die beiden Funktionen, die ich _Cilk_spawn die gewünschten CUDA Kernel nennen. Auch wenn ich zum nvcc Befehl den Parameter -lcilkrts hinzufüge, sind die Fehler gleich. Ich habe auch #include "cilk/cilk.h" am Anfang des Codes.

Können Sie mir bitte helfen? Warum zeigt es diese Fehler an und kompiliert es nicht? Vielen Dank im Voraus!

Antwort

1

Der Grund, warum kompiliert wird, ist, dass nvcc keine cilk-Implementierungen und Schlüsselwörter unterstützt. Sie benötigen einen Wrapper, der die CUDA-Funktionen von Ihrem CILK-Code aufruft. Hier ist ein Beispiel, wie man einen Wrapper schreibt und es von Ihrem CILK-Code aus aufruft: cilk with cuda sample.

In dem Link wird auch erläutert, wie Sie den Cuda-Code und den Cilk-Code kompilieren und verknüpfen.

+0

Ich werde das versuchen, danke! – BabisI