cuPointerGetAttribute()返回的设备错误无效

时间:2014-12-18 16:40:41

标签: cuda nvidia

此问题与先前在此处未经回答的问题相同: 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 ) );

1 个答案:

答案 0 :(得分: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