Massimizzazione del riutilizzo di una funzione primitiva in CUDA

1

Sto lavorando all'implementazione di alcuni algoritmi correlati in CUDA, ognuno dei quali richiede una primitiva che chiameremo f() . Gli algoritmi correlati non possono semplicemente chiamare f , poiché richiedono f di avere un comportamento leggermente diverso per ciascun algoritmo.

f è tuttavia una funzione altamente ottimizzata, quindi non voglio sovraccaricare f per ogni caso, perché se finisco per apportare modifiche a f allora ho bisogno di cambiare ogni sovraccarico.

f ha un aspetto simile al seguente:

__device__ void f(const int *R, const int *C, const int n, int *d, int *Q, int *Q2)
{
    for(int i=blockIdx.x; i<n; i+=gridDim.x)
    {
         //Cooperatively inspect R and C and place results into d
    }
}

In realtà è molto più complicato in quanto utilizza molte istruzioni __shfl e quant'altro, ma non dovrebbe essere rilevante qui. Il problema è che tutti gli algoritmi correlati hanno bisogno di variazioni leggermente diverse di f ma dal momento che f è complicato, voglio solo che sia il codice in una posizione.

Ecco i requisiti degli algoritmi correlati:

A: Una variabile periferica globale aggiuntiva per tenere traccia del massimo di un insieme di dati

B: Un array O (n) o O (n ^ 2) aggiuntivo per la registrazione di dati interi in vari stadi di f

C: Simile a B ma registrazione di dati binari

D: Richiede uno stack e un array per la registrazione di dati in vari stadi di f (la matrice è la stessa di cui si ha bisogno in B). Ha anche altri requisiti, ma questi sono gestiti meglio separatamente.

Come posso evitare di duplicare f e renderlo flessibile per questi casi d'uso?

    
posta Adam27X 22.01.2015 - 21:01
fonte

0 risposte

Leggi altre domande sui tag