cudaMemPrefetchAsync()返回cudaErrorInvalidDevice - 为什么?

时间:2017-04-15 19:12:34

标签: debugging cuda

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

我认为下面发布的代码示例没有错误,但在第52行(致cudaMemPrefetchAsync())我一直收到此错误。

我试过了:

  1. 清理驱动程序安装。 (最新版本)
  2. 我查了谷歌的答案,但我找不到任何答案。 (我设法只找到this
  3. (我不知道其他任何事情)

    系统规范:

    操作系统:Microsoft Windows 8.1 x64主页。
    IDE: Visual Studio 2015
    CUDA工具包: 8.0.61
    NVIDIA GPU: GeForce GTX 960M
    NVIDIA GPU驱动程序:版本381.65(最新)
    计算能力: 5.0(麦克斯韦尔)
    支持统一内存支持:
    英特尔集成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();
    }
    ///////////
    

1 个答案:

答案 0 :(得分:3)

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

查看更多here