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?