Visual studio 2010 CUDA内核内的断点\uuuu全局\uuuuu未命中

Visual studio 2010 CUDA内核内的断点\uuuu全局\uuuuu未命中,visual-studio-2010,cuda,Visual Studio 2010,Cuda,使用visual Studio 2010。赢7分。Nsight 2.1 #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; fo

使用visual Studio 2010。赢7分。Nsight 2.1

#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;
}
#包括“cuda.h”
#包括“cuda_runtime.h”
#包括“设备启动参数.h”
//incrementArray.cu
#包括
#包括
无效增量ArrayOnHost(浮点*a,整数N)
{
int i;
对于(i=0;i此处的断点
如果(此处为idxbreakpoint
}
内部主(空)
{
浮点*a_h,*b_h;//指向主机内存的指针
float*a_d;//指向设备内存的指针
int i,N=10;
大小\u t size=N*sizeof(浮动);
//在主机上分配阵列
a_h=(浮动*)malloc(大小);
b_h=(浮动*)malloc(大小);
//在设备上分配阵列
Cudamaloc((空隙**)和a_d,尺寸);
//主机数据的初始化
对于(i=0;i(a_d,N);
//从设备检索结果并存储在b_h中
cudaMemcpy(b_h,a_d,sizeof(float)*N,cudaMemcpyDeviceToHost);
//检查结果
对于(i=0;i(a_d,N);但它们会跳过整个内核代码部分

试图在变量i和j上添加监视,但出现错误“CXX0017:错误:未找到符号“i”


这个问题正常吗?有人可以试一下他们的电脑,让我知道他们是否可以达到断点吗?如果可以,我的问题可能是什么?请帮助!:(

Nsight调试不同于VS调试。您需要使用Nsight调试来命中内核断点。但是,为此,您需要2个GPU卡。您首先有2个卡吗?请检查您可以在单个GPU上调试,但必须满足以下条件:

  • 您必须使用5.0工具包
  • 您必须在支持303.xx NForceWare或更高版本的GPU上编程

  • 您试图设置断点的代码在编译器输出中不存在。CUDA编译器非常积极地删除“死”代码,这对内核中的内存写入没有任何结果。如果您使用
    a[idx]
    依赖于
    i
    ,它应该由编译器保留,并且您应该能够在调试过程中检查它。您是在进行本地调试还是远程调试?我认为默认情况下,F5在Visual Studio中启动本地调试,而Nsight->start CUDA调试将在您在启动选项中配置的目标中执行。No,我正在运行笔记本电脑的GPU.Geforce gt 520m。那么,如果在笔记本电脑上进行编程,那么就没有其他方法来调试内核了吗?谢谢您的回答。:@f0rfun:您可以使用GPU卡连接到外部计算机进行调试。我知道这是可能的,但以前从未这样做过。我应该修改我的答案以包括这一点,还是您会接受它?