今天我想測試全局內存緩衝區如何分配和存儲在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是實現 - 隨機和獨立?
感謝您的回答,您的解釋似乎是合理的。在AMD論壇上,主持人表示,這是因爲OpenCL內存模型是一致的,所以對於多個設備使用的緩衝區,運行時可能會將其複製到每個設備的內存以獲得更好的訪問速度,因此地址將會不同。但我不認爲它適用於APU內存,因爲「Fusion」是它的功能,更不用說我將緩衝區分配在零拷貝區域。你的理解與我相同,這是非常有用的。 TKS! – acekiller