【问题标题】:Invalid device error returned by cuPointerGetAttribute()cuPointerGetAttribute() 返回的设备错误无效
【发布时间】:2014-12-18 16:40:41
【问题描述】:

这个问题与之前在此处提出但未得到回答的问题相同: https://stackoverflow.com/questions/22996075/invalid-device-error-return-by-cupointergetattribute.

我使用 GTX680、CUDA 6.5 工具包、NVIDIA 340.46 内核。 GPU具有统一的寻址能力和计算能力3.0。

以下代码返回CUDA_ERROR_INVALID_DEVICE

CUDA_DR_ASSERT(cuMemAlloc(&dev_ptr, size));
CUDA_DR_ASSERT(cuPointerGetAttribute(&tokens, CU_POINTER_ATTRIBUTE_P2P_TOKENS, dev_ptr));

有没有人(Sankar?)遇到过类似的问题并找到原因?

编辑:这是我从中得到错误的代码:

CUDA_DR_ASSERT( cuInit(0) );
CUdevice dev;
CUDA_DR_ASSERT( cuDeviceGet(&dev, 0) );
CUDA_ASSERT(cudaSetDevice(dev));

CUdeviceptr dev_ptr;
std::size_t size = 2*65536; 

CUDA_DR_ASSERT( cuMemAlloc( &dev_ptr, size ) );
uint flag = 1; // set CU_POINTER_ATTRIBUTE_SYNC_MEMOPS (set to 0 for unsetting this option)
CUDA_DR_ASSERT( cuPointerSetAttribute(&flag, CU_POINTER_ATTRIBUTE_SYNC_MEMOPS, dev_ptr) );
CUDA_POINTER_ATTRIBUTE_P2P_TOKENS tokens;
CUDA_DR_ASSERT( cuPointerGetAttribute( &tokens, CU_POINTER_ATTRIBUTE_P2P_TOKENS, dev_ptr ) );

【问题讨论】:

  • 你们中的任何一个人都提供了MCVE,SO 期望此类问题出现。您是否尝试创建 GPUDirect RDMA 接口? GPUDirect RDMA 是not available on GeForce GPUs
  • 感谢 Robert 提供的示例代码。是的,我正在尝试创建一个 GPUDirect RDMA 接口。由于需要大多数通用虚拟寻址,因此我想尝试 GeForce,直到出现“不支持”错误。我一开始在没有令牌的情况下实现了它,使用 cuPointerSetAttribute 中的 SYNC_MEMOPS 选项,并在调用 nvidia_p2p_get_pages 时从 nvidia 内核获取了一个 INVALID ARGUMENT。这就是为什么我也尝试了令牌。我想知道为什么我没有收到“不支持”的错误消息,而是“无效的设备”。
  • 您问了这个问题:“有没有人(Sankar?)有类似的问题并找到原因?”您收到错误消息,因为 GeForce 不支持 GPUDirect RDMA。

标签: cuda nvidia


【解决方案1】:

我的系统在设备 0 上有一个 Quadro GPU,在设备 1 上有一个 GeForce GPU。 这是一个完整的示例:

$ cat t642.cpp
#include <cuda.h>
#include <helper_cuda_drvapi.h>
#include <drvapi_error_string.h>

int main(int argc, char *argv[]){

  int my_dev = 0;
  int dev_count = 0;
  if (argc > 1) my_dev=atoi(argv[1]);
  CUcontext my_ctx;
  checkCudaErrors(cuInit(0));
  checkCudaErrors(cuDeviceGetCount(&dev_count));
  if (my_dev > dev_count-1) {printf("device does not exist\n"); return 1;}
  char deviceName[256];
  checkCudaErrors(cuDeviceGetName(deviceName, 256, my_dev));
  printf("using device %d, %s\n", my_dev, deviceName);
  checkCudaErrors(cuCtxCreate(&my_ctx, 0, my_dev));
  CUdeviceptr dev_ptr;
  size_t size = 256;
  CUDA_POINTER_ATTRIBUTE_P2P_TOKENS tokens;
  checkCudaErrors(cuMemAlloc(&dev_ptr, size));
  checkCudaErrors(cuPointerGetAttribute(&tokens, CU_POINTER_ATTRIBUTE_P2P_TOKENS, dev_ptr));
  printf("success!\n");
  return 0;
}

$ g++ -I/usr/local/cuda/include -I/usr/local/cuda/samples/common/inc t642.cpp -lcuda -o t642
$ ./t642 0
using device 0, Quadro 5000
success!
$ ./t642 1
using device 1, GeForce GT 640
checkCudaErrors() Driver API error = 0101 "CUDA_ERROR_INVALID_DEVICE (device specified is not a valid CUDA device)" from file <t642.cpp>, line 22.
$

不支持将 GeForce GPU 与此机制(旨在支持 GPUDirect RDMA)一起使用。这在GPUDirect RDMA documentation 中有记录,其中指出:

GPUDirect RDMA 可在 Tesla 和 Quadro GPU 上使用。

虽然这不是问题的症结所在,但您可能还希望阅读 GPUDirect RDMA 发行说明,其中指出 this token mechanism was deprecated in CUDA 6.0

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多