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 ..所以,或者這不應該給我錯誤,或者我不知道如何讓他們..什麼是答案?
除非OpenCL實現有問題,否則我非常懷疑它會使系統崩潰。更可信的是應用程序的崩潰,甚至可能是GPU掛起,但絕對不是系統崩潰。否則,人們可以輕鬆地進行基於OpenCL的DoS攻擊。 – Ruslan
你會感到驚訝。在具有IOMMU的虛擬內存實現和系統的現代GPU上,通常不存在問題。較早的GPU世代(例如GeForce 8xxx/9xxx)似乎只是使用物理內存地址,所以在沒有IOMMU的情況下,它們確實會導致各種崩潰。 – pmdj