2016-09-21 44 views
0

在測量OpenCL內核的執行時間時,我遇到了奇怪的行爲。內核需要三個緩衝區作爲輸入。我在主機代碼中創建這些緩衝區,並使用CL_MEM_COPY_HOST_PTR對它們進行初始化。然後我通過OpenCL事件測量內核執行時間。但是,當我省略CL_MEM_COPY_HOST_PTR時,內核執行時間下降到三分之一。未初始化緩衝區時內核執行時間下降

到目前爲止,我發現這個問題與OpenCL編譯器的優化有關。它看起來像編譯器注意到緩衝區沒有被初始化,並相應地優化了內核。如果我提供標誌「-cl-opt-disable」,則初始化和不初始化緩衝區之間的執行時間沒有區別。但禁用所有優化顯然不是我打算做的。

有沒有辦法阻止編譯器注意到緩衝區在沒有禁用所有優化的情況下未被初始化?不幸的是,只寫入一個字節到緩衝區中並沒有這樣做。

在此先感謝!

+0

您使用的是clenqueuewrite還是clenqueuemap?也許你正在做這些額外的副本? –

+0

所以你試圖微調一些東西,並希望編譯器不要以不同的方式優化內核?那麼您可以測試它,而不會將內存從主機複製到GPU的潛在瓶頸?你確定那不是已經發生了什麼?也許它更快,因爲內存只是保持在GPU上緩存? (這可能沒有意義,我不瞭解OpenCL,主要是優化和硬件的工作原理)。 –

回答

1

CL_MEM_COPY_HOST_PTR強制CL驅動程序將您的內存複製到設備。因此,任何進一步的內核執行取決於讀取數據將被阻止,直到複製操作完成。

在兩種情況下,內核執行時間(由CL剖析報告)肯定是相同的。但是,如果你只是從CPU端進行測量(請不要那樣做!),即使內核沒有真正運行,但是等待複製操作,你也會看到執行時間增加。

通過禁用優化,內核時間可能比副本有更大的影響,因此將其映射到測量中。

注:您可能嘗試更多的東西。

  • 設置你的內核,以「WRITE_ONLY」或您的CL緩衝區「WRITE_ONLY」,即應使內核運行瞬間即使緩衝區沒有準備好。
  • 緩衝區創建後進入sleep()
  • 運行內核2次並測量第二個。
相關問題