cudaMemPrefetchAsync上的设备序号无效

时间:2018-06-06 09:49:33

标签: cuda

我在Windows 10和CUDA 9.2上的GeForce 1080 Ti(Pascal)上运行玩具CUDA样本。

目标是测试cudaMemPrefetchAsync到CPU,因为它应该工作。

但是,我在此特定行上收到CUDA错误(无效设备序号)。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <cstdio>
#include <cstdlib>

void fill(int* a, int val, int N) {
    for (int k = 0; k < N; ++k) {
        a[k] = val;
    }
}

__global__ void add(int* a, int* b, int N)
{
    for (int i = threadIdx.x + blockIdx.x * blockDim.x; i < N; i += blockDim.x * gridDim.x) {
        a[i] += b[i];
    }
}

inline void check(cudaError_t err, const char* file, int line) {
    if (err != cudaSuccess) {
        ::fprintf(stderr, "ERROR at %s[%d] : %s\n", file, line, cudaGetErrorString(err));
        abort();
    }
}

#define CUDA_CHECK(err) do { check(err, __FILE__, __LINE__); } while(0)

int main()
{
    int deviceId;
    CUDA_CHECK(cudaGetDevice(&deviceId));
    const int N = 1024*1024*32;
    int *a, *b;
    CUDA_CHECK(cudaMallocManaged(&a, N * sizeof(int)));
    CUDA_CHECK(cudaMallocManaged(&b, N * sizeof(int)));

    CUDA_CHECK(cudaMemPrefetchAsync(a, N * sizeof(int), cudaCpuDeviceId)); // program breaks here
    CUDA_CHECK(cudaMemPrefetchAsync(b, N * sizeof(int), cudaCpuDeviceId));
    fill(a, 1, N);
    fill(a, 2, N);

    CUDA_CHECK(cudaMemPrefetchAsync(a, N * sizeof(int), deviceId));
    CUDA_CHECK(cudaMemPrefetchAsync(b, N * sizeof(int), deviceId));

    add<<<32, 256>>>(a, b, N);

    CUDA_CHECK(cudaGetLastError());
    CUDA_CHECK(cudaDeviceSynchronize());

    return 0;
}

这是硬件/驱动程序/操作系统限制吗?我可以简单地忽略错误吗?

1 个答案:

答案 0 :(得分:4)

  

这是硬件/驱动程序/操作系统限制吗?

是的,后者。引自documentation

  

具有SM架构6.x或更高版本的GPU(Pascal类或更新版本)   提供其他统一内存功能,例如按需页面   整个过程中概述的迁移和GPU内存超额预订   这个文件。请注意,目前这些功能仅支持   在Linux操作系统上。

目前Windows不支持异步页面迁移,以及当您尝试启用它时出现错误的原因。