2013-01-17 43 views
1

在OpenCL中,您需要在執行圖像讀取時定義採樣器(read_image *),並在該採樣器中指定地址如何鉗位(例如,您可以執行CLK_ADDRESS_CLAMP_TO_EDGE)。但是沒有用於圖像寫入的採樣器(write_image *)。所以沒有指定夾緊。 什麼是應該發生的像素地址,然後退出圖像邊界?這只是沒有指定,並留給供應商? 從網絡上看,似乎大多數具有write_images的OpenCL代碼都不使用任何鉗位,或者人們使用自己的鉗位功能。我不明白爲什麼鉗位未指定用於寫入,但指定爲讀取。我在這裏錯過了什麼嗎?我已經搜索了一遍,並且雙重閱讀了規範,沒有任何內容解釋寫入操作是如何被鉗制的。OpenCL中的write_image請求如何被鉗制?

回答

3

從OpenCL的1.2規範,6.12.14.4:

write_imagef,write_imagei和write_imageui用於與 未指定上述說明或與image_channel_data_type值創建圖像 對象的行爲(X,Y)不在 範圍內的座標值(0 ...圖像寬度-1,0 ...圖像高度-1), 未定義。

沒有寫入限制,它留給用戶內核代碼以確保座標有效。

+0

該死的。我沒有看到。謝謝! –

+0

在我使用NVIDIA和AMD設備的經驗中,在圖像之外寫作什麼都不做。所以你在寫之前不必檢查出界限。我認爲紋理單元只是以某種方式丟棄寫入操作。 –

+1

@Erik它會導致nVidia硬件崩潰,例如使用nVidia SDK 5.0的gtx 480 – omarzouk

3

在某些設備(例如,較舊的NVIDIA硬件)上,不僅沒有圖像寫入鉗制,寫入外部圖像邊界將以常常難以調試的方式(因爲它是GPU崩潰)崩潰。避免這樣做。