Tôi có đoạn mã (kernel) sau đây.cấp phát bộ nhớ bên trong hạt nhân 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);
}
Khi nó tĩnh (ngay cả các kích thước giống nhau) nó rất nhanh, nhưng khi CurrentProbs được cấp phát động (như trên) hiệu suất là khủng khiếp.
Câu hỏi này cho biết tôi có thể làm được điều này bên trong một hạt nhân: CUDA allocate memory in __device__ function
Dưới đây là một câu hỏi liên quan: Efficiency of Malloc function in CUDA
tôi đã tự hỏi nếu có phương pháp khác đã giải quyết này khác so với cái được đề xuất trong bài báo? Nó có vẻ vô lý mà người ta không thể malloc/miễn phí bên trong một hạt nhân mà không có loại hình phạt.
'tmp' xuất phát từ đâu trong mã giả của bạn? – talonmies
xin lỗi - tmp = nCác thành viên [0]; –
Vì vậy, nó là liên tục cho mỗi lời gọi hạt nhân? Nếu vậy, tại sao bận tâm với phân bổ bộ nhớ dyanmic ở tất cả? – talonmies