2013-03-15 27 views
13

Çekirdek işlevinde, her ikisi de size uzunluğunda (aslında sizeof(float)*size) paylaşılan iki paylaşılan bellek istiyorum.İki farklı vektör için dinamik paylaşımlı bellek ayırma kullan

extern __shared__ float row[]; 
extern __shared__ float results[];  
: çekirdek içinde

myKernel<<<numBlocks, numThreads, 2*sizeof(float)*size>>> (...); 

ve: Bu değişken gerekiyorsa çekirdek işlevinde doğrudan bellek tahsis etmek mümkün olmadığından

, ben gibi dinamik olarak tahsis etmek zorunda

Ancak, bu işe yaramıyor. Bunun yerine

, Ayrılmış 2*size belleği kullanarak, tüm verileri içeren tek bir vektör extern __shared__ float rowresults[] yaptı. Yani row çağrıları hala aynıdır ve results çağrıları rowresults[size+previousIndex] gibidir. Ve bu işe yarıyor.

Büyük bir sorun değil çünkü beklenen sonuçları zaten aldım, ancak dinamik olarak ayrılmış paylaşılan belleğimi iki (veya daha fazla) farklı değişkene ayırmanın herhangi bir yolu var mı? Sadece güzellik için.

cevap

9

C Programming guide section on __shared__ dinamik olarak ayrılan paylaşılan bellek birden fazla diziler tahsis örnekler içerir:

sadece yeni bir dizi, bunu adapte olabilir inanıyoruz bir öğe için bir işaretçi alma ve yapıyoruz yana
extern __shared__ float array[]; 
__device__ void func()  // __device__ or __global__ function 
{ 
    short* array0 = (short*)array; 
    float* array1 = (float*)&array0[128]; 
    int* array2 = (int*)&array1[64]; 
} 

Örnekte sahip oldukları statik ofsetler yerine dinamik ofsetleri kullanmak. Ayrıca, uyumun aynı olması gerektiğini de unutmayın, bu da sizin durumunuzda bir sorun olmamalıdır.

+0

Bunu yapmanın daha güzel bir yolu, aradığım şey buydu. Teşekkürler. – machlas

+0

@Imortenson Bu yöntem, bellekteki öğelerin dinamik erişim hizalamasının yararlarını destekliyor mu? Eğer belleği “sizeof (float)” olarak tahsis ettiyseniz veya “float” dizilimini izleyecekseniz 'float4'a 32byte 'hizasında erişilir mi? Teşekkürler. – BugShotGG

+0

Örneğinizde dizilerinizin boyutlarını biliyorsunuz; öyleyse neden yerine bir struct tanımlamıyorsunuz ve paylaşılan belleği bu yapı olarak yeniden yorumluyorsunuz? – einpoklum

İlgili konular