2012-02-10 6 views
0

aide studios visuels 2010. Win 7. Nsight 2,1à l'intérieur du noyau CUDA Breakpoints __global__ ne pas frapper

#include "cuda.h" 
#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

// incrementArray.cu 
#include <stdio.h> 
#include <assert.h> 

void incrementArrayOnHost(float *a, int N) 
{ 
    int i; 
    for (i=0; i < N; i++) a[i] = a[i]+1.f; 
} 
__global__ void incrementArrayOnDevice(float *a, int N) 
{ 
    int idx = blockIdx.x*blockDim.x + threadIdx.x; 

    int j = idx; 
    int i = 2; 

    i = i+j; //->breakpoint here 

    if (idx<N) a[idx] = a[idx]+1.f; //->breakpoint here 
} 
int main(void) 
{ 
    float *a_h, *b_h;   // pointers to host memory 
    float *a_d;     // pointer to device memory 
    int i, N = 10; 
    size_t size = N*sizeof(float); 
    // allocate arrays on host 
    a_h = (float *)malloc(size); 
    b_h = (float *)malloc(size); 
    // allocate array on device 
    cudaMalloc((void **) &a_d, size); 
    // initialization of host data 
    for (i=0; i<N; i++) a_h[i] = (float)i; 
    // copy data from host to device 
    cudaMemcpy(a_d, a_h, sizeof(float)*N, cudaMemcpyHostToDevice); 
    // do calculation on host 
    incrementArrayOnHost(a_h, N); 
    // do calculation on device: 
    // Part 1 of 2. Compute execution configuration 
    int blockSize = 4; 
    int nBlocks = N/blockSize + (N%blockSize == 0?0:1); 
    // Part 2 of 2. Call incrementArrayOnDevice kernel 
    incrementArrayOnDevice <<< nBlocks, blockSize >>> (a_d, N); 
    // Retrieve result from device and store in b_h 
    cudaMemcpy(b_h, a_d, sizeof(float)*N, cudaMemcpyDeviceToHost); 
    // check results 
    for (i=0; i<N; i++) assert(a_h[i] == b_h[i]); 
    // cleanup 
    free(a_h); free(b_h); cudaFree(a_d); 

    return 0; 
} 

J'ai essayé d'insérer des points d'arrêt énumérés ci-dessus dans mon global incrementArrayOnDevice vide (float * a, int N) mais ils ne frappent pas.

Quand je cours débogage (f5) dans les studios visuels, j'essayé d'entrer dans incrementArrayOnDevice < < < nBlocks, blockSize >>> (A_D, N); mais ils ignoreraient toute la section du code du noyau.

essayé d'ajouter une montre sur les variables i et j mais il y avait une erreur "CXX0017: Erreur: symbole" i "pas trouvé."

Ce problème est-il normal? Quelqu'un peut-il s'il vous plaît essayer sur leur PC et laissez-moi savoir si elles peuvent atteindre les points d'arrêt? Si vous le pouvez, quel pourrait être le problème? S'il vous plaît aider! :(

+0

Le code sur lequel vous essayez de définir des points d'arrêt n'existe pas dans la sortie du compilateur. Le compilateur CUDA est très agressif pour supprimer le code "mort" qui n'a aucun résultat sur les écritures de mémoire dans le noyau. Si vous faites que 'a [idx]' dépend de 'i', il devrait être conservé par le compilateur et vous devriez être capable de l'inspecter pendant le débogage. – talonmies

+0

Est-ce que vous faites du débogage local ou à distance? Je pense que _F5_ démarre un débogage local par défaut dans Visual Studio, alors que Nsight -> Démarrer le débogage CUDA va le faire dans la cible que vous avez configurée dans les Options de lancement – pQB

Répondre

1

débogage Nsight est différent de débogage VS. Vous devez utiliser le débogage Nsight pour frapper les points d'arrêt du noyau. Cependant, pour cela, vous avez besoin de 2 cartes GPU. Avez-vous 2 cartes en premier lieu? S'il vous plaît vérifier

+0

Non, je cours sur le GPU d'un ordinateur portable. Geforce GT 520m. Il n'y a donc pas d'autre moyen de déboguer le noyau si la programmation est faite sur un ordinateur portable? Merci pour votre réponse. :) – f0rfun

+0

@ f0rfun: Vous pouvez vous connecter à un ordinateur externe avec une carte GPU pour le débogage. Je sais que c'est possible mais je ne l'ai jamais fait auparavant. Dois-je modifier ma réponse pour l'inclure ou allez-vous l'accepter? – Programmer

+0

l'a accepté. :) Merci. – f0rfun

0

Vous pouvez déboguer sur un seul GPU, mais dans les conditions suivantes:

  1. Vous devez être en utilisant 5,0 boîte à outils
  2. Vous devez être la programmation sur un GPU qui suports 303.xx NForceWare ou plus