Il driver Nvidia e il problema di num_physpages

A luglio Linus Torvald rimosse la variabile num_physpages dalla versione 3.11 del kernel di Linux. Questa decisione ha però determinato una conflittualità tra il codice sorgente del driver fornito da Nvidia e il kernel stesso. La num_physpages era definita nel gestore mm della memoria di Linux.

Oggi, l’ultimo driver stabile di Nvidia è il 319.60 e ci sono ancora i riferimenti alla variabile suddetta nel file d’intestazione nv-linux.h. Se anche voi avete una distribuzione con il kernel 3.11 (o più recente) e tentate, come ho fatto io, di compilare il driver per le schede video, otterrete il seguente messaggio di errore:


In file included from /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/os-interface.c:26:0:
   /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/os-interface.c: In function ‘os_get_system_memory_size’:
   /tmp/selfgz4790/NVIDIA-Linux-x86_64-319.49/kernel/nv-linux.h:1040:41: error: ‘num_physpages’ undeclared (first use in this function)
    #define NV_NUM_PHYSPAGES                num_physpages
                                            ^

Come già detto, num_physpages è stata tolta da Torvalds, quindi per il momento non c’è altra soluzione che correggere il file nv-linux.h del driver con una patch oppure un editor di testo. Potete scaricare la patch dalla Rete, ma si tratta di un file specifico per una particolare versione del driver di Nvidia che dovreste adattare alla vostra situazione. A questo indirizzo troverete le istruzioni per procedere nel modo corretto. Oltre a servirvi di una patch, in alternativa potete modificare il file nv-linux.h durante l’installazione del driver, per esempio seguendo questa procedura:

  1. Eseguite l’installer di Nvidia con l’opzione -x, il comando decomprirà l’archivio che contiene il codice sorgente del driver.
  2. Modificate il file nv-linux.h, che trovate nella directory kernel, con un editor, vi oppure gedit vanno benissimo.
  3. Cercate la riga che ha la seguente definizione in linguaggio C #define NV_NUM_PHYSPAGES   num_physpages, dovreste trovarla inserita fra altre definizioni, esattamente come nell’esempio sottostante:
    
    #if !defined(NV_VMWARE):
    #define NV_NUM_PHYSPAGES                num_physpages
    #define NV_GET_CURRENT_PROCESS()        current->tgid
    #define NV_IN_ATOMIC()                  in_atomic()
    
  4. Dopo la riga corrispondente all’istruzione condizionale #if, ma prima della definizione #define NV_GET_CURRENT_PROCESS ecc. dovete creare un nuovo blocco che corrisponda al seguente codice per il preprocessore C:
    
    #if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3, 11, 0)</p>
    #define NV_NUM_PHYSPAGES                get_num_physpages()
    #else</p>
    #define NV_NUM_PHYSPAGES                num_physpages
    #endif
    
  5. Ultimate le vostre modifiche, avrete esattamente questo:
    
    #if !defined(NV_VMWARE)
    #if LINUX_VERSION_CODE &gt;= KERNEL_VERSION(3, 11, 0)</p>
    #define NV_NUM_PHYSPAGES                get_num_physpages()
    #else
    #define NV_NUM_PHYSPAGES                num_physpages
    #endif</p>
    #define NV_GET_CURRENT_PROCESS()        current-&gt;tgid
    #define NV_IN_ATOMIC()
    
  6. Potete ora chiudere l’editor ed eseguire il comando nvidia-installer che trovate nella directory principale del driver.

Ubuntu 13.10 è in circolazione da poco tempo e utilizza un kernel recentissimo che non è compatibile con il driver per le schede video GeForce. Il bug dovrebbe essere ormai già noto ai programmatori di Nvidia, anche se il problema non sembra molto diffuso fra gli utenti. In questo caso è bastato cercare la patch con un motore di ricerca, usando i termini num_physpage, kernel 3.11 e Nvidia. Vista l’importanza raggiunta da Linux, e in particolare dalla distribuzione Ubuntu, mi aspetto da un giorno all’altro un driver che sia compatibile con il recente kernel 3.11 e 3.12.

Nvidia non deve abbassare i prezzi

Dovrebbe abbassare i prezzi Nvidia? A questa domanda una fonte che conosce profondamente l’industria delle schede video ha detto, in un’intervista rilasciata alla rivista PCR, che non è necessario un gioco al ribasso sul prezzo di listino delle GeForce Titan. La fonte ritiene che il nuovo processore grafico Radeon R9 290X  di AMD non batterà di molto il modello di prima classe di Nvidia. I benchmark di alcuni siti specializzati mostrano quest’oggi una differenza modestissima di FPS: con un test di 45 secondi fatto eseguendo il gioco Tom Raider a qualità “ultra” e alla risoluzione di 3840×2160, è risutato che solo quattro frame per secondo separano le due schede. Inoltre, c’è anche una diceria che circola intensamente a proposito di un modello erede del Titan che Nvidia metterebbe in vendita per competere meglio con il nuova accelleratore grafico di AMD. Se fosse vera, sarebbe opportuno effettuare il taglio al prezzo della Titan.

Diamoci un taglio
Diamoci un taglio

Al di là dell’aspetto economico di queste schede di prima classe, bisogna considerare che si tratta di bench effettuati a risoluzioni HD, pochi giocatori le usano. Inoltre, queste schede per il momento non hanno sbocco nel gaming sotto Linux dove tra i driver dei due produttori c’è troppa disparità di qualità (vd. i recenti bench di Miachael Larabel) e l’offerta di video game è limitata.

Fonte:

  1. ‘Nvidia doesn’t need to lower prices to compete with new AMD R7/R9 cards’

Nouveau e CPUFreq: Geforce 9800 supera GTX680

Il recente test di Michael Larabel sul driver AMD open source, fra le due versione del kernel 3.11 e 3.12 (da git), ha reso evidente un miglioramento delle prestazioni del computer. Lo stesso test è stato ripetuto con il driver Nouveau, però in questo caso il guadagno è risultato minimo con le schede denominate Kepler e Fermi. Per quale motivo? Il motivo è che il driver open source non supporta ancora il reclock, ovvero la selezione del livello delle prestazioni della GPU.

I cambiamenti nel codice di CPUFreq (il modulo che governa la frequenza d’esercizio della CPU) hanno giovato alle GPU Radeon, ma non a tutte quelle di marca nVidia. Da tempo c’è la possibilità di fare “re-clocking” delle schede grafiche GeForce: fino alla serie 7 il reclock avveniva in fase di boot e non interessava la velocità della VRAM; a partire dalla serie 8, i modelli M dei portatili avevano la capacità di riaggiustare sia il clock della RAM video sia quello del core della GPU. Questa modifica fu decisa per ridurre i consumi energetici quando la GPU si trovava per lo più in riposo. Il clock era impostato a una velocità intermedia fra il valore massimo e quello minimo d’esercizio. Con le GeForce 200 il clock al boot era impostato a ⅓ della velocità massima della GPU. Con le schede video denominate Fermi (dalla serie 400 alla 600) le prestazioni sono peggiorate perché il clock di default è al 10% della frequenza massima d’esercizio e non c’è ancora modo di fare reclock usando il driver Nouveau. Per questo motivo nel test di Michael la scheda 9800GTX ha superato una GeForce GTX680.

PTS: Nouveau bench con Xonotic
PTS: Nouveau bench con Xonotic