неверный порядковый номер устройства на cudaMemPrefetchAsync - PullRequest
0 голосов
/ 06 июня 2018

Я запускаю игрушечный образец CUDA на моем GeForce 1080 Ti (Pascal) на Windows 10 и CUDA 9.2.

Цель состоит в том, чтобы протестировать cudaMemPrefetchAsync с процессором, так как он должен работать.

Однако я получаю ошибку 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 голосов
/ 06 июня 2018

Это ограничение оборудования / драйвера / ОС?

Да, последнее.Цитирование из документации

Графические процессоры с архитектурой SM 6.x или выше (класс Pascal или новее) предоставляют дополнительные функции унифицированной памяти, такие как миграция страниц по требованию и переподписка памяти графического процессора.которые изложены в этом документе.Обратите внимание, что в настоящее время эти функции поддерживаются только в операционных системах Linux.

Таким образом, асинхронная миграция страниц в настоящее время не поддерживается в Windows, и поэтому при возникновении ошибкипопробуйте включить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...