Mam następujące (fragment) jądra.Alokacja pamięci wewnątrz jądra 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);
}
Kiedy to statyczne (nawet te same rozmiary) to bardzo szybko, ale kiedy CurrentProbs jest dynamicznie przydzielana (jak wyżej) wydajność jest okropne.
To pytanie powiedział, że mogę robić to wewnątrz jądra: CUDA allocate memory in __device__ function
Oto powiązany pytanie: Efficiency of Malloc function in CUDA
Zastanawiałem się, czy jakieś inne metody rozwiązali ten inny niż ten proponowany w artykule? Wydaje się absurdalne, że nie można zaszczepić/uwolnić wewnątrz jądra bez tego rodzaju kary.
Skąd pochodzi 'tmp' w twoim pseudo-kodzie? – talonmies
Przepraszam - tmp = nComponents [0]; –
Czy jest to stałe w przypadku wywołania jądra? Jeśli tak, to po co w ogóle zajmować się pamięcią dynamiczną? – talonmies