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

Posted

技术标签:

【中文标题】cuPrintf 啥都不做(程序使用固定+映射内存,CUBLAS 也是)【英文标题】:cuPrintf does nothing (program uses pinned+mapped memory, CUBLAS also)cuPrintf 什么都不做(程序使用固定+映射内存,CUBLAS 也是) 【发布时间】:2013-03-17 19:22:58 【问题描述】:

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

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

除了常规的东西之外,我的程序还使用了以下内容:

CUBLAS 库 页面锁定(固定)+ 映射内存

为什么对 cuPrintf 的调用没有做任何事情?

编辑 以下是代码中一些相关的sn-ps:

__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() 函数)作为动态链接模块(共享对象)。

【问题讨论】:

也许你应该发布一些代码。如果您在内核调用之后调用 cudaDeviceSynchronize() 并对其进行 cuda 错误检查,会发生什么? @RobertCrovella - 我已编辑问题以包含一些代码。由于我使用的是旧版本的 API,所以我使用了 cudaThreadSynchronize() 而不是 cudaDeviceSynchronize(),它不会返回任何错误。 您使用的是哪个版本?需要的是检查内核调用是否有错误,使用类似于here 描述的方法和 cudaPeekAtLastError() @RobertCrovella - 我使用的是 3.2 版。我使用类似于您提到的链接中描述的方法检查了对运行时 API 的调用是否有错误,并且没有返回错误。 【参考方案1】:

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

【讨论】:

以上是关于cuPrintf 啥都不做(程序使用固定+映射内存,CUBLAS 也是)的主要内容,如果未能解决你的问题,请参考以下文章

DotNet Pack 啥都不做

C++ std::Thread 程序啥都不做[关闭]

Windows 上的 Electron Packager 啥都不做

应用程序(helanzb)是一个系统猪,nice 19 啥都不做

pushViewController 在多个标签应用程序中啥都不做?

当用户啥都不做时,应用程序中的屏幕没有关闭