私は以下の(スニペットの)カーネルを持っています。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);
}
それは静的です(でも同じサイズ)、それは非常に高速ですが、CurrentProbsを動的に(上記のように)割り当てられた場合、パフォーマンスがひどいです。
この質問は、私は、カーネル内部でこれを行うことができると言いました。ここでCUDA allocate memory in __device__ function
は、関連する質問です:Efficiency of Malloc function in CUDA
任意の他の方法は、論文で提案したものよりも、この他を解決した場合、私は不思議でしたか? この種の罰金がないと、カーネル内でmalloc/freeを実行できないというのはばかげているようです。
'tmp'は擬似コードのどこから来ますか? – talonmies
申し訳ありません - tmp = nComponents [0]; –
これはカーネル呼び出しごとに一定ですか?もしそうなら、なぜダイナミックメモリ割り当てに悩まされますか? – talonmies