2012-12-10 15 views
5

In base alla documentazione NVidia per il cuLaunchKernel function, i kernel compilati con CUDA 3.2+ contengono informazioni relative all'elenco dei parametri. C'è un modo per recuperare queste informazioni a livello di codice da un handle CUfunction? Ho bisogno di conoscere il numero di argomenti e la dimensione di ogni argomento in byte di un kernel dal suo handle CUfunction. Ho visto la documentazione NVidia di cui sopra che afferma che questa informazione esiste, ma non ho visto da nessuna parte nella documentazione CUDA che indica un modo programmatico per accedere a queste informazioni.Come posso recuperare le informazioni sull'elenco dei parametri per un kernel CUDA 4.0+?

Per aggiungere ulteriori spiegazioni: sto lavorando con un sistema middleware. La sua libreria frontside sostituisce libcuda (la libreria API del driver) sul sistema di destinazione. La parte posteriore viene quindi eseguita come daemon su un altro host che utilizza la risorsa GPGPU e chiama la vera libcuda su quella macchina. Esistono altre soluzioni middleware che già fanno questo con cuLaunchKernel, quindi è sicuramente possibile. Inoltre, CUDA stesso usa queste informazioni per sapere come analizzare i parametri dal puntatore che passi in cuLaunchKernel.

Modifica: Originariamente avevo la versione CUDA in cui sono stati introdotti questi metadati elencati in modo errato. Era 3.2, non 4.0, secondo lo cuLaunchKernel documentation.

+0

CUfunction è il kernel, preceduto da __global__. Hai bisogno della dimensione degli argomenti di CUfunction? Se hai il kernel puoi trovarlo. – ahmad

+0

Sì, ho bisogno della dimensione dei suoi argomenti. Non ho la sorgente del kernel, solo un handle (presumibilmente restituito da una precedente chiamata a cuModuleGetFunction()). In particolare, ho bisogno del numero di argomenti e della dimensione di ogni argomento. – reirab

risposta

1

cuLaunchKernel è progettato per avviare i kernel per i quali si conosce il prototipo della funzione. Non esiste API per "reverse engineering" il prototipo di funzione.

+2

mi è venuto in mente che * se * il kernel è stato compilato con il collegamento C++, dovrebbe essere possibile decodificare il nome del simbolo storpiato dal simbolo del carico utile ELF del dispositivo in un fatbinary o cubin. Ma se il kernel è compilato con il collegamento C che non funzionerà ...... – talonmies

+0

Abbastanza vero! :) – harrism

+0

haha, si, sfortunatamente non posso supporre che sia stato usato il collegamento C++. Secondo la documentazione di cuLaunchKernel, il numero e il tipo di argomenti sono memorizzati come metadati con qualsiasi kernel compilato con CUDA 4.0+, ma non ho visto alcuna API pubblica per accedere a queste informazioni. Questi metadati sono il modo in cui cuLaunchKernel analizza gli argomenti, tuttavia, e sono a conoscenza di altri middleware che supportano cuLaunchKernel, quindi deve esserci un modo per raggiungerlo. Speravo in qualcosa di meglio che analizzare personalmente il cubino, ma potrebbe essere proprio questo. – reirab

1

Sto lavorando sullo stesso problema (non so se nel frattempo l'hai risolto). Sto usando un kernel noto per indagare su come viene usata la memoria puntata di CUfunction. Questa è la versione senza parametri:

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(){ 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

Questa è la versione un parametro e così via.

#include<cstdio> 

extern "C" { 
    __global__ void HelloWorld(int a) { 
     int thid = (blockIdx.x * blockDim.x) + threadIdx.x; 
    } 
} 

Ti suggerisco di scaricare i primi 1024 byte della memoria indicata da CUfunction e seguire i puntatori. Ad esempio all'offset 0x30 c'è un puntatore che punta a una tabella di puntatori. Ho notato che la dimensione della struttura inviata da CUfunction non cambia con il numero dei parametri di funzione, quindi la tabella che stiamo cercando deve essere cacciata seguendo i puntatori.

Problemi correlati