Come risolvere gli errori di OpenCL no platform
Questa guida spiega cosa fare quando un'applicazione OpenCL non funziona. Nella maggior parte dei casi, ciò accade perché l'applicazione non riesce a trovare un dispositivo di calcolo disponibile, in genere la GPU.
Controllare i driver della GPU
Supponiamo di avere un server con Ubuntu 22.04 e una GPU NVIDIA® che supporta OpenCL. Il primo passo consiste nel verificare che il driver della GPU sia installato correttamente. Il metodo più semplice per verificarlo è utilizzare l'utilità di monitoraggio:
nvidia-smi
Se si riscontra un errore, installare prima il driver della GPU. È possibile farlo seguendo le istruzioni di Installa i driver NVIDIA® in Linux. Se viene visualizzata una tabella che elenca tutte le schede video, verificare attentamente quale versione del driver è installata e quale versione di NVIDIA® CUDA® è presente nel sistema.
Le versioni moderne dei driver delle schede video iniziano in genere con 5, ad esempio 535.XXX. Se si trova una versione che inizia con 4 (ad esempio 4XX.XXX), significa che il driver deve essere aggiornato. Lo stesso principio si applica a CUDA: le versioni attuali iniziano con 12, ad esempio 12.6. Se si utilizza una versione più vecchia, è necessario aggiornare all'ultima versione utilizzando la guida Installa il toolkit CUDA® in Linux.
Verifichiamo che le variabili d'ambiente includano il percorso dei file eseguibili del compilatore:
nvcc --version
Se tutto è a posto, si riceverà l'output della versione del compilatore disponibile. Ciò significa che qualsiasi applicazione eseguita avrà accesso al compilatore senza dover specificare il percorso completo. Se il sistema segnala l'assenza di NVIDIA® CUDA® sul server, ma l'utilità nvidia-smi mostra una versione installata, è necessario aggiungere il percorso alle variabili d'ambiente. Questo può essere fatto in due modi: temporaneamente o permanentemente.
Per una soluzione temporanea, sono sufficienti due comandi. Ecco un esempio che utilizza CUDA® 12.6 installato sul server:
export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PATH=/usr/local/cuda-12.6/bin${PATH:+:${PATH}}
Per verificare le modifiche, provare a visualizzare nuovamente la versione di NVCC. Se le variabili d'ambiente sono state impostate correttamente, l'errore dovrebbe essere risolto. Per una soluzione permanente, aggiungere entrambe le variabili di cui sopra al file /etc/environment:
sudo nano /etc/environment
Aggiungete quindi la variabile LD_LIBRARY_PATH e completate la variabile PATH:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/cuda-12.6/bin"
LD_LIBRARY_PATH="/usr/local/cuda-12.6/lib64"
Salvare il file premendo Ctrl + O, quindi uscire dall'editor con Ctrl + X. Dopo il riavvio, il comando di chiamata NVCC funzionerà correttamente.
Verificare la disponibilità di OpenCL
Diamo un'occhiata a OpenCL, un framework per lo sviluppo di applicazioni ottimizzate per il calcolo parallelo. I driver delle GPU implementano il supporto per questo framework e le prestazioni dell'applicazione dipendono da loro.
Per verificare se un server è pronto a lavorare con OpenCL, è possibile installare una piccola utility diagnostica chiamata clinfo:
sudo apt -y install clinfo
Eseguitela ed esaminate il breve risultato. Ci concentreremo su due aspetti fondamentali: il numero di piattaforme e il numero di dispositivi disponibili:
clinfo | grep Number
Quando il sistema è pronto a lavorare con OpenCL, l'output apparirà come segue:
Number of platforms 1 Number of devices 2 Number of async copy engines 2 Number of async copy engines 2
Nella terminologia di OpenCL, "piattaforma" si riferisce al tipo di dispositivi di calcolo disponibili. Può trattarsi di una CPU, di una GPU o anche di un FPGA. Nel nostro esempio, abbiamo eseguito il comando su un server con due schede grafiche NVIDIA® RTX™ 3090, ottenendo questi valori. In sostanza, abbiamo due dispositivi di elaborazione appartenenti a un unico tipo (GPU).
Se la colonna "Numero di piattaforme" mostra 0, significa che il sistema operativo non è pronto per eseguire applicazioni OpenCL. In questo caso, verificare se i driver appropriati sono installati sul sistema. Se i problemi persistono, provare a rimuovere completamente i driver della GPU, riavviare il server e quindi reinstallarli.
Controllare le librerie OpenCL
È opportuno verificare anche la presenza delle librerie OpenCL necessarie:
ldconfig -p | grep -i opencl
Se le librerie sono installate correttamente, il risultato dovrebbe essere simile a questo:
libnvidia-opencl.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libnvidia-opencl.so.1 libnvidia-opencl.so.1 (libc6) => /lib/i386-linux-gnu/libnvidia-opencl.so.1 libOpenCL.so.1 (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so.1 libOpenCL.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenCL.so.1 libOpenCL.so (libc6,x86-64) => /usr/local/cuda/targets/x86_64-linux/lib/libOpenCL.so libOpenCL.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libOpenCL.so
Se il sistema non dispone di queste librerie, è possibile installarle manualmente:
sudo apt install ocl-icd-opencl-dev && sudo apt install opencl-headers
Aggiornamento
In Ubuntu 22.04, alcuni modelli di GPU potrebbero risultare completamente inaccessibili a OpenCL, anche dopo aver reinstallato tutti i driver e il toolkit CUDA®. La soluzione migliore per questo problema è il downgrade alla versione precedente del sistema operativo, insieme al downgrade dei driver e di CUDA®.
Per esempio, se si utilizza l'acceleratore Tesla® V100 (introdotto nel 2017), è consigliabile scegliere Ubuntu 20.04 invece di Ubuntu 22.04. Abbinate a questo il driver 535.183.01 e CUDA® 12.2. Questa combinazione garantisce il corretto funzionamento della maggior parte delle applicazioni basate su OpenCL.
In alcuni casi, potrebbe non essere necessario cambiare la versione del sistema operativo. Sarà invece necessario effettuare un downgrade delle versioni del driver e di CUDA®.
Vedere anche:
Aggiornato: 28.03.2025
Pubblicato: 23.09.2024