Ho il seguente (snippet) di un kernel.allocazione di memoria all'interno di un kernel CUDA
__global__ void plain(int* geneVec, float* probs, int* nComponents, float* randomNumbers,int *nGenes)
{
int xid = threadIdx.x + (blockDim.x * blockIdx.x);
float* currentProbs= (float*)malloc(sizeof(float)*tmp);
.....
.....
currentProbs[0] = probs[start];
for (k=1;k<nComponents[0]; k++)
{
currentProbs[k] = currentProbs[k-1] + prob;
}
...
...
free(currentProbs);
}
Quando è statici (anche le stesse dimensioni) è molto veloce, ma quando CurrentProbs è allocato dinamicamente (come sopra) prestazioni è pessimo.
Questa domanda ha detto che potevo fare questo all'interno di un kernel: CUDA allocate memory in __device__ function
Ecco una questione connessa: Efficiency of Malloc function in CUDA
Mi chiedevo se altri metodi hanno risolto questo diverso da quello proposto nella carta? Sembra ridicolo che non si possa malloc/free all'interno di un kernel senza questo tipo di penalità.
Da dove viene il 'tmp' nel tuo pseudo-codice? – talonmies
sorry - tmp = nComponents [0]; –
Quindi è costante per chiamata del kernel? In tal caso, perché preoccuparsi dell'allocazione della memoria dyanmica? – talonmies