2017-10-05 14 views
4

我學習,使強大的代碼OpenCL和麪臨着以下內核代碼:這應該給出一個錯誤,如果是的話,如何檢查它? (OpenCL的)

string kernel_code = 
" void kernel simple_add(global const int *A, " 
"      global const int *B, " 
"      global int *C, int n) { " 
"            " 
" int index = get_global_id(0);    " 
" C[index]=A[index]+B[index];     " 
" }            "; 

而且使用的目的,下面的代碼把它發送到GPU:

Kernel ker(program, "simple_add"); 
ker.setArg(0, buffer_A); 
ker.setArg(1, buffer_B); 
ker.setArg(2, buffer_C); 
ker.setArg(3, N); 
q.enqueueNDRangeKernel(ker,NullRange,NDRange(32),NDRange(32)); 
q.finish(); 

事情是,我正在使用比需要更多的工作項目,所以我認爲我應該檢查索引是否超出了內核代碼的範圍。但我沒有使用它,並檢查由enqueueNDRangeKernel或完成返回的錯誤是給我CL_SUCCESS ..所以,或者這不應該給我錯誤,或者我不知道如何讓他們..什麼是答案?

回答

2

如C和C++中,數組會出界是OpenCL中不確定的行爲,所以不一定會引發錯誤的條件,但可引起幾乎任何類型的異常行爲。所以不要依賴你的運行時間來解決這種編程錯誤。這很可能是你的程序崩潰了,或者甚至整個系統會因爲這種錯誤而崩潰(如果它不使用IOMMU),而不是返回值中的錯誤代碼。

作爲一個實現細節,您很可能會發現緩衝區以4096字節的增量映射到GPU的內存空間 - 一頁內存。所以如果你的越界訪問仍然在一個有效的4096字節的頁面內,它很可能表現得像一個典型的基於CPU的緩衝區溢出。

+0

除非OpenCL實現有問題,否則我非常懷疑它會使系統崩潰。更可信的是應用程序的崩潰,甚至可能是GPU掛起,但絕對不是系統崩潰。否則,人們可以輕鬆地進行基於OpenCL的DoS攻擊。 – Ruslan

+0

你會感到驚訝。在具有IOMMU的虛擬內存實現和系統的現代GPU上,通常不存在問題。較早的GPU世代(例如GeForce 8xxx/9xxx)似乎只是使用物理內存地址,所以在沒有IOMMU的情況下,它們確實會導致各種崩潰。 – pmdj

相關問題