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?