2017-09-27 6 views
0

J'essaie de suivre un tutoriel que j'ai trouvé online. J'utilise Ubuntu 17, compilant à partir de la ligne de commande.Renvoyer un nombre incorrect en ajoutant dans CUDA

#include <stdio.h> 
#include <iostream> 

__global__ void add(int a, int b, int *c) 
{ 
    *c = a + b; 
} 

int main() 
{ 
    int a,b,c; 
    int *d_c; 
    int size = sizeof(int); 

    a = 2; 
    b = 7; 

    cudaMalloc((void **)&d_c,size; 
    add<<<1,1>>>(a,b,d_c); 
    cudaMemcpy(&c,d_c,size,cudaMemcpyHostToDevice); 
    std::cout << a << " + " << b << " = " << c << std::endl; 
    cudaFree(d_c); 

    return 0; 
} 

Quand je compilez avec nvcc je reçois l'erreur suivante:

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

J'ignoré l'avertissement et a couru a.out comme d'habitude, et je reçois la sortie:

2 + 7 = 1

La dernière fois que j'ai fait des maths, c'est incorrect. Je ne suis pas sûr si je fais ceci incorrectement, ou si le tutoriel que je suis est trop vieux, ou si cela a quelque chose à faire avec l'avertissement? Toute aide ou conduit fera l'affaire. Je mentionnerai également que je n'ai pas pu compiler avec nvcc jusqu'à ce que j'installe gcc-5. Je crois que je les ai liés ensemble correctement en utilisant these instructions j'ai trouvé ici. J'ai également examiné this solution ici aussi. Cependant, je n'ai pas trouvé la réponse particulièrement utile donc j'apprécierais un peu de perspicacité si cela compile correctement, pourquoi ceci n'imprime pas correctement à mon terminal.

Toute aide serait grandement appréciée.

Répondre

2

Votre appel à cudaMemcpy() est incorrect. Vous devez copier le résultat de la mémoire du périphérique (GPU) vers la mémoire hôte (CPU), et non l'inverse. Le bon kind drapeau à utiliser est cudaMemcpyDeviceToHost:

cudaMemcpy(&c, d_c, size, cudaMemcpyDeviceToHost); 

Afin de simplifier la mise au point à l'avenir, pensez à la mise en œuvre proper CUDA API error checking ainsi que l'exécution systématiquement vos programmes avec cuda-memcheck, cuda-gdb, valgrind et assainissants Clang.

+0

Nous vous remercions de votre réponse. Cependant, j'ai mis à jour mon code pour utiliser 'cudaMemcpyDeviceToHost' et j'obtiens toujours le résultat de 1. Permettez-moi d'essayer la vérification d'erreur, j'ai pris un pic à ce sujet plusieurs fois mais jamais pensé à essayer de l'implémenter. – Sailanarmo

+0

Juste découvert mon erreur, merci beaucoup de m'avoir conduit à la vérification d'erreur. GPU Assert retourné, 'aucun périphérique compatible CUDA est détecté hello.cu 29' Je vais aller de l'avant et de comprendre pourquoi cela se produit. – Sailanarmo

+0

Il est bon que vous ayez implémenté la vérification d'erreur immédiatement. Parfois, cela prend du temps pour convaincre les gens de faire cela. Ainsi, le message d'erreur dit: votre fonction noyau n'est même pas exécutée, car le moteur d'exécution CUDA ne trouve pas de périphérique compatible CUDA. Assurez-vous que vous avez une carte Nvidia récente (Fermi et au-dessus, [un de ceux-ci] (https://developer.nvidia.com/cuda-gpus) avec Compute Capability> = 2.0) et que [le pilote est correctement installé] (http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html). Après avoir trié ces derniers, le code fixe devrait fonctionner. – Drop