2016-04-11 8 views
1

Wenn Sie Arrays aus dem globalen Speicher in den gemeinsamen Speicher laden, tun Variablen im Shared Memory nicht, was ich will.Wie man Werte in extern geteiltes Array lädt

template<class T> 
__global__ void kernel(T *t1,T *t2) 
{ 
    int tid=threadIdx.x; 
    extern __shared__ T array1[]; 
    extern __shared__ T array2[]; 
    array1[tid]=t1[tid];//copy (1) 
    array2[tid]=t2[tid];//copy (2) 
    __syncthreads(); 
} 

Dinge ergeben sich, dass array1 [tid] = array2 [tid] = t2 [tid]. Wenn Sie die Stelle von Kopie (1) und Kopie (2) austauschen, ist das Ergebnis array1 [tid] = array2 [tid] = t1 [tid]. nur wenn ich "extern" entferne das Ergebnis geht was ich will (array1 [tid] = t1 [tid], array2 [tid] = t2 [tid]). Kann jemand erklären warum?

Antwort

1

Dies:

extern __shared__ T array1[]; 
extern __shared__ T array2[]; 

wird so, wie Sie denken nicht. Diese Zeiger (array1 und array2) zeigen auf den gleichen Ort.

Wenn Sie mehrere Arrays mit dynamisch zugewiesenem gemeinsamen Speicher haben möchten, müssen Sie die Anweisungen in der programming guide befolgen. Etwas wie dieses:

extern __shared__ T array1[]; 
T * array2 = array1 + size_of_array_1; 

sollte funktionieren.

Und sicher sein, eine Größe Zuordnung in den Kernel-Start Parameter zu übergeben, die sowohl ausreichend Bytes für ist die Größe von array1 und der Größe der array2

+0

Ist es möglich, dass sowohl „statisch __shared__“ und „extern __shared__“ existieren im selben Kernel wie: "__shared__ float array1 [N]" und "extern __shared__ T array2 []"? – fireplay

+0

Ich glaube, Sie sollten in der Lage sein, sowohl statische als auch dynamische Zuweisungen im selben Kernel zu verwenden, haben Sie es versucht? –

+0

Ja, ich habe es, vielen Dank. – fireplay