2016-06-27 35 views
1

我最近開始學習OpenCL,並對OpenCL中緩存與內核之間的交互提出了疑問。我正在編寫一個程序來測量訪問主內存的延遲(繞過緩存)因此,我想知道在內核執行完成後緩存是否自動清除,或者它會保留並在重複執行同一內核時使用? 謝謝!重複啓動同一內核時緩存會如何影響

+0

這取決於實施;這當然不是由OpenCL規範指定的。我無法想象在內核調用之間清除內存緩存的任何價值,所以我會認爲它不是。 – Dithermaster

回答

0

在OpenCL存儲器層次結構中,沒有「緩存」(就CPU而言)。在OpenCL中有不同類型的記憶,你可以用一些指令來控制。在這裏,你可以對我的意思一看:

enter image description here

最快的存儲器是專用存儲器和本地存儲器。你可以在這個內存空間中聲明變量並控制它們,並以你喜歡的方式移動它們。您應該小心,因爲在本地內存中,您可以在「塊」之間共享數據,並且只有線程才能看到Privite中的數據。 Here你可以找到很多其他的信息。 所以,如果你反覆運行一個內核,你可以將你的變量存儲在你喜歡的內存中,並且你會注意到,如果這些變量在私有內存中,那麼與其他解決方案相比,它將會非常快速。

1

對於AMD Radeon GCN,L1和L2高速緩存在所有內核和所有不同的內核之間持續存在。內核可以使用來自任何其他內核的緩存數據。此外,計算單元內的本地內存在內核運行之間(更確切地說,在工作組運行之間)不會被清除/歸零。這意味着你必須初始化局部變量。這同樣適用於nVidia/CUDA設備和通用SIMD CPU。這就是說,OpenCL並不知道或定義不同級別的緩存,緩存是供應商特定的。處理或管理緩存的任何功能都是特定於供應商的擴展。

要測試延遲,請在內核中使用僞隨機數生成器,並讀取隨機存儲器地址。使用2個內核,第1個內核會污染所有緩存,第2個會執行實際的延遲測量。