【发布时间】:2012-04-06 01:42:13
【问题描述】:
我有以下 (sn-p) 的内核。
__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来自哪里? -
所以每次内核调用它都是常数?如果是这样,为什么还要为动态内存分配而烦恼呢?