cuPrintf什么都不做(程序使用固定+映射内存,CUBLAS也)

时间:2013-03-17 19:22:58

标签: cuda

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

  • 使用-arch sm_11
  • 进行编译
  • 使用cudaPrintfInit和cudaPrintfEnd
  • 对每个内核调用进行环绕
  • 确保字符数足够小以使用默认缓冲区大小
  • 确保cudaPrintfInit和cudaPrintfDisplay返回cudaSuccess

我的程序除常规内容外还使用以下内容:

  • CUBLAS图书馆
  • 页面锁定(固定)+映射内存

为什么对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
}

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

1 个答案:

答案 0 :(得分:1)

想出来:我有另一个内核给出了“无效的配置参数”错误。我使用的内核块大小为32 * 32 * 1,这超过了每个块允许的最大线程数。一旦修复,cuPrintf就开始工作了。