2017-09-27 1 views
0

J'ai un programme qui se compose de 3 fichiers, un fichier .c et deux .cu fichiers, nn.cu et parallel.cu. La fonction principale est située dans le fichier .cu, le nn.cu et le fichier .c (utils.c) Je l'ai comme extern "C" dans le parallel.cu. Je veux paralléliser davantage le programme (qui fonctionne parfaitement sans cilk), donc je considérais cilk, avec _Cilk_spawn et _Cilk_sync:combinaison CILA et CUDA et la compilation

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; 

} 

Le problème est quand je tente de compiler toutes ces choses ensemble avec 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". 

Les deux fonctions I _Cilk_spawn appellent les noyaux CUDA désirés. Même si j'ajoute à la commande nvcc le paramètre -lcilkrts, les erreurs sont les mêmes. J'ai également #include "cilk/cilk.h" au début du code

Pouvez-vous s'il vous plaît aidez-moi? Pourquoi montre-t-il ces erreurs et ne compile-t-il pas? Merci d'avance!

Répondre

1

La raison pour laquelle il n'est pas compilé est que nvcc ne supporte pas les implémentations de cilk et les mots-clés. Vous avez besoin d'un wrapper qui appelle les fonctions CUDA à partir de votre code CILK. Voici un exemple sur la façon d'écrire un wrapper et appelez-le à partir de votre code de cilk: cilk with cuda sample. Dans le lien, il explique également comment compiler le code cuda et le code cilk et comment les lier.

+0

Je vais essayer, merci! – BabisI