2012-10-04 70 views
2

有人可以解釋併發Cuda流中的數據獨立性要求嗎? 假設我想運行下面的內核在8個併發流Cuda流數據獨立性

Kernel<<<blocks, threads>>>(float *readOnlyInput, float *output); 

都可以流讀取相同的* readOnlyInput和不同的輸出*陣列寫?

或者爲了達到他們所需要閱讀不同內存位置的數據,以及併發?

將上面的僞代碼片段同時執行, 或它需要* readOnlyInput + i * size來確保併發性?

cudaStream_t stream[8]; 

int size = 1000;//some array size 

int blocks =2, threads=256;//some grid dims 

for (int i = 0; i < 8; ++i){ 

    cudaStreamCreate(&stream[i]); 

} 
for (int i = 0; i < 8; ++i){ 

    Kernel<<<blocks, threads, stream[i]>>>(float *readOnlyInput, float *output + i*size); 

} 

回答

1

您可以安全地讀取來自不同流的多個獨立的內核相同的數據,只要有一個地方足夠的同步,以確保數據完全寫入任何內核開始之前,並且數據在所有內核完成之前不會被重寫。

+0

如果我想同時運行它們,會發生什麼不流同步? – thanasisanthopoulos

+0

然後數據在內核讀取時會發生變化,這不是一個好主意。您可以並行運行內核,但數據必須在所有內核的整個持續時間內保持不變。 – tera

+0

是的,但它們讀取相同的只讀數組並操作輸出數組的不同部分。沒有寫入衝突。他們只是從同一個內存位置讀取一些只讀數組..如何在內核讀取時更改只讀數據? – thanasisanthopoulos