Tengo el siguiente (fragmento) de un kernel.Asignación de memoria dentro de 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);
}
Cuando es (incluso los mismos tamaños) estáticas es muy rápido, pero cuando CurrentProbs se asigna dinámicamente (como antes) el rendimiento es horrible.
Esta pregunta me dijeron que podía hacer esto dentro de un núcleo: CUDA allocate memory in __device__ function
Aquí es una pregunta relacionada: Efficiency of Malloc function in CUDA
Me preguntaba si otros métodos han resuelto este no sea el que se propone en el documento? Parece ridículo que uno no pueda malloc/free dentro de un kernel sin este tipo de penalización.
¿De dónde viene 'tmp' en su pseudo código? – talonmies
sorry - tmp = nComponents [0]; –
Entonces, ¿es constante por invocación de kernel? Si es así, ¿por qué molestarse con la asignación de memoria dianmica en absoluto? – talonmies