我有以下内容(片段)。
__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,这似乎是荒谬的。
答案 0 :(得分:8)
我认为引入malloc()减慢代码速度的原因是它在全局内存中分配内存。当您使用固定大小的数组时,编译器可能会将它放在寄存器文件中,这要快得多。
在内核中执行malloc可能意味着您尝试使用单个内核完成太多工作。如果每个线程分配不同的内存量,那么每个线程在for循环中运行的次数不同,并且会产生很多扭曲。
如果warp中的每个线程循环次数相同,则只需预先分配。即使它们运行的次数不同,也可以使用恒定的大小。但相反,我认为您应该考虑如何重构代码以完全从内核中删除该循环。