cudaMemPrefetchAsync() 返回 cudaErrorInvalidDevice - 为什么?

Pat*_*ykB 5 debugging cuda

每当我调用它时cudaMemPrefetchAsync(),它都会返回错误代码cudaErrorInvalidDevice。我确信我传递了正确的设备 ID(我的笔记本电脑中只有一个支持 CUDA 的 GPU id == 0)。

我相信下面发布的代码示例是没有错误的,但是在行52(调用cudaMemPrefetchAsync())中我不断收到此错误。


我试过:

  1. 干净的驱动程序安装。(最新版本)
  2. 我检查谷歌寻找答案,但找不到任何答案。(我只找到了这个

(其他的我没啥想法了)


系统规格:

操作系统: Microsoft Windows 8.1 x64 家庭版。
IDE: Visual studio 2015
CUDA 工具包: 8.0.61
NVIDIA GPU: GeForce GTX 960M
NVIDIA GPU 驱动程序:版本 381.65(最新)
计算能力: 5.0 (Maxwell)
统一内存支持:支持。
英特尔集成GPU:英特尔高清显卡4600


代码示例:

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// TEST AREA:
// -- INCLUDE: 
/////////////////////////////////////////////////////////////////////////////////////////////////////////

// Cuda Libs: ( Device Side ):
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

// Std C++ Libs:
#include <iostream>
#include <iomanip>
///////////





/////////////////////////////////////////////////////////////////////////////////////////////////////////
// TEST AREA:
// -- NAMESPACE:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
using namespace std;
///////////





/////////////////////////////////////////////////////////////////////////////////////////////////////////
// TEST AREA:
// -- START POINT:
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int main() {

    // Set cuda Device:
    if (cudaSetDevice(0) != cudaSuccess)
        cout << "ERROR: cudaSetDevice(***)" << endl;

    // Array:
    unsigned int size = 1000;
    double * d_ptr = nullptr;

    // Allocate unified memory:
    if (cudaMallocManaged(&d_ptr, size * sizeof(double), cudaMemAttachGlobal) != cudaSuccess)
        cout << "ERROR: cudaMallocManaged(***)" << endl;

    if (cudaDeviceSynchronize() != cudaSuccess)
        cout << "ERROR: cudaDeviceSynchronize(***)" << endl;

    // Prefetch:
    if(cudaMemPrefetchAsync(d_ptr, size * sizeof(double), 0) != cudaSuccess)
        cout << "ERROR: cudaMemPrefetchAsync(***)" << endl;

    // Exit:
    getchar();
}
///////////
Run Code Online (Sandbox Code Playgroud)

Pat*_*ykB 7

感谢talonmies,我意识到我的 GPU 不支持prefetch该功能。为了能够使用cudaMemPrefetchAsync(***)GPU, 中必须具有非零值(cudaDeviceProp)deviceProp.concurrentManagedAccess

在这里查看更多内容。