Cuda cuPrintf不执行任何操作(程序也使用固定的+;映射内存)

Cuda cuPrintf不执行任何操作(程序也使用固定的+;映射内存),cuda,Cuda,我需要从CUDA内核打印一些值,并尝试使用cuPrintf。我的计算能力是1.1,所以我不能使用printf。程序编译正确,也不会出现任何运行时错误。然而,cuPrintf系列似乎什么也没做。以下是我尝试过的一些事情: 使用-arch sm_11编译 用cudaPrintfInit和cudaPrintfEnd包围每个内核调用 确保字符数足够小,可以使用默认缓冲区大小 确保cudaPrintfInit和cudaPrintfDisplay返回cudaSuccess 我的程序除了使用常规内容外,还

我需要从CUDA内核打印一些值,并尝试使用cuPrintf。我的计算能力是1.1,所以我不能使用printf。程序编译正确,也不会出现任何运行时错误。然而,cuPrintf系列似乎什么也没做。以下是我尝试过的一些事情:

  • 使用-arch sm_11编译
  • 用cudaPrintfInit和cudaPrintfEnd包围每个内核调用
  • 确保字符数足够小,可以使用默认缓冲区大小
  • 确保cudaPrintfInit和cudaPrintfDisplay返回cudaSuccess
我的程序除了使用常规内容外,还使用以下内容:

  • 库布拉斯图书馆
  • 页面锁定(固定)+映射内存
为什么打电话给cuPrintf没有任何作用

编辑
以下是代码中的一些相关片段:

__global__ void swap_rows(float *d_A, int r1, int r2, int n)
{
  int i = r1;
  int j = blockDim.x*blockIdx.x + threadIdx.x;
  cuPrintf("(%d,%d) ", i, j);

  if(j >= n) return;
  float tmp;
  tmp = d_A[L(i,j)];
  d_A[L(i,j)] = d_A[L(r2,j)];
  d_A[L(r2,j)] = tmp;
}

extern "C" float *someFunction(float *_A, float *_b, int n)
{
  int i, i_max, k, n2 = n*n;
  dim3 lblock_size(32,1);
  dim3 lgrid_size(n/lblock_size.x + 1, 1);
  float *d_A, *d_b, *d_x, *h_A, *h_b, *h_x, tmp, dotpdt;

  cublasStatus status;
  cudaError_t ret;

  if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
    fprintf(stderr, "Error setting device flag: %s\n", 
            cudaGetErrorString(ret));
    return NULL;
  }

  // Allocate mem for A and copy data
  if((ret = cudaHostAlloc((void **)&h_A, n2 * sizeof(float), 
                            cudaHostAllocMapped)) != cudaSuccess) {
    fprintf(stderr, "Error allocating page-locked h_A: %s\n", 
            cudaGetErrorString(ret));
    return NULL;
  }

  if((ret = cudaHostGetDevicePointer((void **)&d_A, h_A, 0)) != cudaSuccess) {
    fprintf(stderr, "Error getting devptr for page-locked h_A: %s\n", 
            cudaGetErrorString(ret));
    return NULL;
  }

  if((ret = cudaMemcpy(h_A, _A, n2 * sizeof(float), cudaMemcpyHostToHost)) !=
      cudaSuccess) {
    fprintf(stderr, "Error copying A into h_A: %s\n", cudaGetErrorString(ret));
    return NULL;
  }

  // Some code to compute k and i_max  

  if(cudaPrintfInit() != cudaSuccess)
    printf("cudaPrintfInit failed\n");

  swap_rows<<<lgrid_size,lblock_size>>>(d_A, k, i_max, n);
  if((ret = cudaThreadSynchronize()) != cudaSuccess)
    fprintf(stderr, "Synchronize failed!\n", cudaGetErrorString(ret));

  if(cudaPrintfDisplay(stdout, true) != cudaSuccess)
    printf("cudaPrintfDisplay failed\n");
  cudaPrintfEnd();

// Some more code
}
\uuuuuu全局\uuuuuu无效交换\u行(浮点*d\u A,整数r1,整数r2,整数n)
{
int i=r1;
int j=blockDim.x*blockIdx.x+threadIdx.x;
铜((%d,%d)”,i,j);
如果(j>=n)返回;
浮动tmp;
tmp=d_A[L(i,j)];
d_A[L(i,j)]=d_A[L(r2,j)];
d_A[L(r2,j)]=tmp;
}
外部“C”float*someFunction(float*\u A、float*\u b、int n)
{
int i,i_max,k,n2=n*n;
dim3 lblock_尺寸(32,1);
dim3 lgrid_尺寸(n/lblock_尺寸x+1,1);
浮动*d_A、*d_b、*d_x、*h_A、*h_b、*h_x、tmp、dotpdt;
库拉索状态;
cudaError_t ret;
if((ret=cudaSetDeviceFlags(cudaDeviceMapHost))!=cudaSuccess){
fprintf(标准,“错误设置设备标志:%s\n”,
cudaGetErrorString(ret));
返回NULL;
}
//为A分配mem并复制数据
如果((ret=cudaHostAlloc((void**)和h_A,n2*sizeof(浮动),
cudaHostAllocMapped)!=cudaSuccess){
fprintf(stderr,“分配锁定的页面时出错:%s\n”,
cudaGetErrorString(ret));
返回NULL;
}
if((ret=cudaHostGetDevicePointer((void**)&d_A,h_A,0))!=cudaSuccess){
fprintf(stderr,“获取锁定页面的devptr时出错:%s\n”,
cudaGetErrorString(ret));
返回NULL;
}
如果((ret=cudaMemcpy(h_A,_A,n2*sizeof(float),cudaMemcpyHostToHost))=
CUDA(成功){
fprintf(stderr,“将A复制到h_A中时出错:%s\n”,cudaGetErrorString(ret));
返回NULL;
}
//一些计算k和i_max的代码
如果(cudaPrintfInit()!=cudaSuccess)
printf(“cudaPrintfInit失败\n”);
交换行(d_A,k,i_max,n);
如果((ret=cudaThreadSynchronize())!=cudaSuccess)
fprintf(stderr,“同步失败!\n”,cudaGetErrorString(ret));
如果(cudaPrintfDisplay(标准输出,true)!=cudaSuccess)
printf(“cudaPrintfDisplay失败\n”);
cudaPrintfEnd();
//还有代码吗
}

我忘了提到:这些方法作为动态链接的模块(共享对象)单独编译(与main()函数不同)。

解决了这个问题:我有另一个内核,它给出了一个“无效配置参数”错误。我在内核中使用了32*32*1的块大小,这超过了每个块允许的最大线程数。这一问题一解决,cuPrintf就开始工作。

也许你应该发布一些代码。如果在内核调用之后放置一个cudaDeviceSynchronize()调用并对其执行cuda错误检查,会发生什么情况?@RobertCrovella-我已经编辑了这个问题以包含一些代码。因为我使用的是较旧版本的API,所以我使用了cudaThreadSynchronize()而不是cudaDeviceSynchronize(),并且它不会返回任何错误。您使用的是哪个版本?需要的是使用类似于cudaPeekAtLastError()@RobertCrovella的方法来检查内核调用是否存在错误-我使用的是3.2版。我使用与您提到的链接中描述的方法类似的方法检查了对运行时API的调用是否存在错误,并且没有返回任何错误。