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! :(
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
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