2015-03-07 4 views
1

Я искал причину, но не повезло. Он не работает по такой простой программе:Cuda Неизвестная ошибка (ErrNo: 30) on cudaMalloc()

#include <iostream> 

using namespace std; 

int main() { 
    int* n; 
    cout << cudaMallocManaged(&n, 4 * sizeof(int)) << endl; 
    return 0; 
} 

Код возврата: 30, неизвестная ошибка. cudaMalloc также не работает с тем же кодом.

Это мое оборудование:

$ lspci | grep NV 
01:00.0 3D controller: NVIDIA Corporation GF117M [GeForce 610M/710M/820M/GT 620M/625M/630M/720M] (rev a1) 

$ nvidia-smi 
Sat Mar 7 14:02:04 2015  
+------------------------------------------------------+      
| NVIDIA-SMI 331.113 Driver Version: 331.113  |      
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 NVS 5200M   Off | 0000:01:00.0  N/A |     N/A | 
| N/A 53C N/A  N/A/N/A | 279MiB/1023MiB |  N/A  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Compute processes:            GPU Memory | 
| GPU  PID Process name          Usage  | 
|=============================================================================| 
| 0   Not Supported            | 
+-----------------------------------------------------------------------------+ 

Я использую Ubuntu 14.10, с помощью CUDA 6.0 из официального репозитория (надеюсь, если Ubuntu не испортить его).

Это лаборатория Lenovo T430s, карта находится на Optimus, так что это может вызвать некоторые проблемы. Я тестировал на другой машине, и работает тот же код.

Update 1

OK, nvidia_uvm не загружается ...

$ lsmod |grep nv 

nvidia    10744914 65 
nvram     14362 1 thinkpad_acpi 
drm     310919 6 i915,drm_kms_helper,nvidia 

$ sudo modprobe nvidia_uvm 
modprobe: ERROR: ../libkmod/libkmod-module.c:816 kmod_module_insert_module() could not find module by name='nvidia_331_updates_uvm' 
modprobe: ERROR: could not insert 'nvidia_331_updates_uvm': Function not implemented 

Update 2

ОК, я переустановил NVidia-331-обновления-УВМ и модуль был загружен.

$ lsmod | grep nv 
nvidia_uvm    34855 0 
nvidia    10744914 66 nvidia_uvm 
nvram     14362 1 thinkpad_acpi 
drm     310919 6 i915,drm_kms_helper,nvidia 

Однако код по-прежнему возвращает ошибку 30.

Update 3

После некоторого более тестирования (в основном пытались работает как корень), теперь я получаю ошибку 71: операция не поддерживается. Однако, если я просто использую cudaMalloc, то это удалось. Я также проверю, поддерживает ли мое устройство унифицированную адресацию памяти.

Update 4

OK, моя карта поддерживает только SM 2.1, поэтому он не поддерживает единую память.

+0

Вы запускаете свою программу с помощью 'optirun', например' optirun./A.out'? – rutsky

+0

Нет, я * не * использую шмелю, но nvidia-prime использует карту NVidia. –

+0

Загружен ли модуль ядра nvidia_uvm? Что находится в 'lsmod | Выход grep nv'? – rutsky

ответ

1

AFAIK nvidia_uvm Модуль ядра необходим для работы CUDA.

Вам необходимо установить пакет с этим модулем ядра, например. nvidia-331-uvm и позволяют это самозарядным путем установки nvidia-modprobe пакета:

sudo apt-get install nvidia-modprobe nvidia-331-uvm 

Если вы не хотите перезагружать после установки nvidia-modprobe, вы можете попытаться запустить программу с правами администратора (например, sudo ./a.out) - модуль должен быть загружен во время работы как корень.