2012-03-21 20 views
6

Bir çekirdeğin aşağıdaki (snippet) bölümüne sahibim.bellek ayırma

__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); 

} 

statik (hatta aynı ebatlarda) var çok hızlı, ama CurrentProbs dinamik (yukarıdaki gibi) tahsis edildiğinde performans korkunç olduğunda. Efficiency of Malloc function in CUDA

başka yöntemler bildiride önerilen olandan bu diğer çözmüş merak ediyordum: CUDA allocate memory in __device__ function İşte

ilgili soru:

Bu soru bir çekirdek içinde bu yapabileceğini söyledi? Bu tür bir ceza olmaksızın bir çekirdeğin içinde mal/serbest kalmaması gülünç görünmektedir.

+0

Sözde kodunuzda 'tmp' nereden geliyor? – talonmies

+0

Üzgünüz - tmp = nComponents [0]; –

+0

Yani, çekirdek çağrısına göre sabittir? Eğer öyleyse, neden dyanmik bellek ayırma ile hiç rahatsız? – talonmies

cevap

7

Malloc() öğesini tanıtmanın nedenini kodunuzu yavaşlatmasının nedeni, belleğin genel bellekte ayırmasıdır. Sabit boyutta bir dizi kullandığınızda, derleyici bunu daha hızlı olan kayıt dosyasına yerleştirecektir.

Çekirdeğinizin içinde bir malloc yapmak, tek bir çekirdekle çok fazla çalışma yapmaya çalıştığınız anlamına gelebilir. Her bir iş parçacığı farklı bir bellek ayırırsa, her iş parçacığı for döngüsünde farklı sayıda çalışır ve çok sayıda çözgü ayrışırsınız.

Bir atlamadaki her iş parçacığı aynı sayıda döngüye girerse, yalnızca önden ayırın. Farklı sayıda çalışsalar bile, sabit bir boyut kullanabilirsiniz. Ancak bunun yerine, kodunuzu çekirdeğinizden tamamen kaldırmak için kodunuzu nasıl yeniden düzenleyebileceğinize bakmanız gerektiğini düşünüyorum.

+1

Programlayıcı, '__shared__' niteleyici'yi kullanarak onları tanımlamazsa, derleyici, çekirdek değişkenlerini hiçbir zaman paylaşılan belleğe alamaz. Sadece kayıt veya yerel hafıza. – talonmies

+0

@talonmies: Açıklama için teşekkürler. Cevabı ben düzenledim. –

İlgili konular