2017-10-05 15 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

相关问题