CUDA: идентификатор "cudaMemGetInfo" не определен - PullRequest
3 голосов
/ 12 сентября 2011

Чтобы оценить, сколько данных может обработать программа за один запуск ядра, я пытаюсь получить некоторую информацию о памяти с помощью cudaMemGetInfo(). Тем не менее, компилятор говорит мне это:
ошибка: идентификатор "cudaMemGetInfo" не определен
Другие функции, такие как cudaGetDeviceProperties();, работают нормально. Нужно ли устанавливать определенную CUDA-версию? Описание библиотеки не содержит информации о версии и т. Д.

РЕДАКТИРОВАТЬ: наименьший возможный код. cudaSetDevice() не генерирует ошибки компилятора, в то время как cudaMemGetInfo() делает

#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
   unsigned int f, t;
   cudaSetDevice(0);
   cudaMemGetInfo(&f, &t);
   return 0;
}

РЕДАКТИРОВАТЬ 2:
Я нахожусь на Linux, используя "инструменты компиляции Cuda, выпуск 2.0, V0.2.1221" (nvcc).
Когда я пытался установить версию драйвера cuda с cudaDriverGetVersion(), произошла та же ошибка (то же самое, когда я использую функцию драйвера cuDriverGetVersion()).
Похоже, система не сообщит мне ни одной детали о себе ...

Ответы [ 2 ]

7 голосов
/ 12 сентября 2011

Для очень старой версии CUDA, которую вы используете, cudaMemGetInfo не является частью API времени выполнения. У него есть аналог в драйвере cuMemGetInfo, который можно использовать вместо него. Обратите внимание, что для использования версии API драйвера этого вызова сначала необходимо установить контекст. Это должно работать на CUDA 2.x:

// CUDA 2.x version
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    unsigned int f, t;
    cudaSetDevice(0);
    cudaFree(0); // This will establish a context on the device
    cuMemGetInfo(&f, &t);
    fprintf(stdout,"%d %d\n",f/1024,t/1024);
    return 0;
}

РЕДАКТИРОВАТЬ: этот ответ применяется к CUDA 3.0 и более поздним версиям:

Ваша проблема не cudaMemGetInfo, это аргументы, которые вы ей предоставляете. Я бы предсказал, что это:

// CUDA 3.0 or later version
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    size_t f, t;
    cudaSetDevice(0);
    cudaMemGetInfo(&f, &t);
    return 0;
}

будет работать там, где не работает ваш пример. Обратите внимание, что nvcc использует компилятор хоста C ++ для компиляции кода хоста, и он не найдет экземпляры функций API с неверными аргументами. Обратите внимание, что прототип cudaMemGetInfo равен

cudaError_t cudaMemGetInfo(size_t * free, size_t * total)       

и аргументы должны быть size_t, что не совпадает с unsigned int на многих платформах.

1 голос
/ 10 февраля 2012

, чтобы исправить эту ошибку:

ошибка: аргумент типа "unsigned int *" несовместим с параметром типа "size_t *".

Я нашел из технического отчета nvidiaдля cuda 3.2 , что: функции драйвера API, которые принимают или возвращают объемы памяти, такие как cuMemAlloc () и cuMemGetInfo (), теперь используют size_t для этой цели, а не unsigned int.

, поэтому вы должны изменить *.cu код, в виде следующих строк:

Неверный код: unsigned int free, total;cuMemGetInfo (& free, & total);

Правильный код: size_t free, total;cuMemGetInfo (& free, & total);

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