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

Cuda cuPointerGetAttribute()返回的设备错误无效,cuda,nvidia,Cuda,Nvidia,这个问题与之前在这里提出的问题相同,但没有得到回答: 我使用的是GTX680、CUDA 6.5工具包、NVIDIA 340.46内核。GPU具有统一的寻址能力和计算能力3.0 以下代码返回CUDA\u错误\u无效\u设备: CUDA_DR_ASSERT(cuMemAlloc(&dev_ptr, size)); CUDA_DR_ASSERT(cuPointerGetAttribute(&tokens, CU_POINTER_ATTRIBUTE_P2P_TOKENS, dev_pt

这个问题与之前在这里提出的问题相同,但没有得到回答:

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

以下代码返回
CUDA\u错误\u无效\u设备

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 ) );

我有一个系统,在设备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.
$
$cat t642.cpp
#包括
#包括
#包括
int main(int argc,char*argv[]){
int my_dev=0;
int dev_count=0;
如果(argc>1)my_dev=atoi(argv[1]);
CUcontext my_ctx;
检查CUDAERRORS(cuInit(0));
检查CUDAERRORS(cuDeviceGetCount(&dev_count));
如果(my_dev>dev_count-1){printf(“设备不存在”);返回1;}
char deviceName[256];
检查CUDAERRORS(cuDeviceGetName(deviceName,256,我的开发者));
printf(“使用设备%d,%s\n”,我的设备,deviceName);
检查CUDAERRORS(cuCtxCreate(&my_ctx,0,my_dev));
CUdeviceptr开发ptr;
尺寸=256;
CUDA_指针_属性_P2P_令牌令牌;
检查错误(积垢(&dev_ptr,尺寸));
检查CUDAERRORS(cuPointerGetAttribute(&tokens,CU_指针_属性_P2P_标记,dev_ptr));
printf(“成功!\n”);
返回0;
}
$g++-I/usr/local/cuda/include-I/usr/local/cuda/samples/common/inc t642.cpp-lcuda-o t642
美元/t642 0
使用设备0,Quadro 5000
成功!
美元/t642 1
使用设备1,GeForce GT 640
检查文件第22行中的CUDAErrors()驱动程序API error=0101“CUDA\u错误\u无效\u设备(指定的设备不是有效的CUDA设备)”。
$
不支持将GeForce GPU与此机制(设计用于支持GPUDirect RDMA)结合使用。文件中记录了这一点,其中说明:

Tesla和Quadro GPU上都提供GPUDirect RDMA


虽然这不是问题的症结所在,但您也可能希望阅读GPUDirect RDMA发行说明,说明这一点。

niether您中的一位已经提供了一个解决此类问题的方法。您正在尝试创建GPUDirect RDMA接口吗?GPUDirect RDMA是。感谢Robert提供的示例代码。是的,我正在尝试创建GPUDirect RDMA接口。由于大多数情况下都需要通用虚拟寻址,所以我想尝试GeForce,直到出现“不支持”错误。我首先在没有使用令牌的情况下实现它,在CuPoTeStStand属性中使用SycCyMeMoPS选项,并且在调用Nvidia2PpGETYPEGPGE时从英伟达内核获得了一个无效的参数。这就是为什么我也尝试了代币。我想知道为什么我没有收到错误消息“不受支持”,而是收到了“无效设备”。您问了这个问题:“有人(Sankar?)有类似的问题并找到了原因吗?”您收到了一个错误,因为GeForce不支持GPUDirect RDMA。