Visual studio 2010 CUDA内核内的断点\uuuu全局\uuuuu未命中
使用visual Studio 2010。赢7分。Nsight 2.1Visual 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
#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卡连接到外部计算机进行调试。我知道这是可能的,但以前从未这样做过。我应该修改我的答案以包括这一点,还是您会接受它?