2012-09-19 62 views
0

今天我想測試全局內存緩衝區如何分配和存儲在OpenCL中,但結果令我困惑。我創建了一個全局內存緩衝區,並將其傳遞到內核中,該內核構建在CPU和GPU設備上,但我將這個緩衝區的前半部分分配給CPU,剩下的一半分配給GPU,並使用不同的偏移量指示不同的偏移量從CPU和GPU的起點開始,所以CPU和GPU可以同時在同一個緩衝區上工作,但在不同的地方工作。然後在內核中,我使用& buffer [offset + tid]得到緩衝區中每個元素的地址,並將地址重新存儲到自身。由全局內存和多個設備之間的不一致地址空間映射困惑

__kernel void foo(__global uint * buffer, const uint offset) 
{ 
    uint tid = get_global_id(0); 
    buffer[offset+tid] = &buffer[offset+tid]; 
} 

之後我發送緩衝區回CPU和打印出來的價值觀,我發現,通過CPU內核返回的地址值是連續的,什麼由GPU返回也是連續的,但是這兩個地址空間是不連續的與彼此。我認爲CPU和GPU正在使用相同的緩衝區,爲什麼緩衝區後半部分的地址與前半部分不連續?如果我只使用一個設備(CPU或GPU),則所有地址都是正確連續的。有沒有人可以幫助我解決這個問題?因爲我猜想這可能是對GPU內存基本概念的誤解,所以我想要詳細解釋。

PS:可以這樣理解:雖然物理上只有一個緩衝區,但全局內存實際上是一個不透明的結構,不同設備返回的地址值將會不同,因爲地址轉換&全局內存和CPU,全局內存和CPU是實現 - 隨機和獨立?

回答

0

問題結尾處的「PS」位於正確的軌道上。

OpenCL設備上的指針值是設備實現定義的,並且僅對特定設備上的單個內核調用的有效期有意義。對於從內核調用到內核調用的相同緩衝區使用不同的基地址是合法的(雖然在實踐中實現可能實際上不這樣做)。

因此,如果您確實將全局內存指針寫入全局內存,你不應該期望在你的內核結束之後指針值是有效的。

+0

感謝您的回答,您的解釋似乎是合理的。在AMD論壇上,主持人表示,這是因爲OpenCL內存模型是一致的,所以對於多個設備使用的緩衝區,運行時可能會將其複製到每個設備的內存以獲得更好的訪問速度,因此地址將會不同。但我不認爲它適用於APU內存,因爲「Fusion」是它的功能,更不用說我將緩衝區分配在零拷貝區域。你的理解與我相同,這是非常有用的。 TKS! – acekiller

相關問題