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