OpenCL仅在循环呼叫时停止运行
OpenCL stops running only while call in a loop
当我尝试将数据循环回内核函数时,我的代码断开,几次迭代后,它停止工作,仅给出0作为答案,有人知道为什么吗?如果我循环整个调用内核的方法,但速度较慢
cl_mem *ptrInput = &Pressure_BUFF;
cl_mem *ptrOutput = &Pressure_OUT_BUFF;
for(int i = 0; i<Interaction_per_frame; i++){
clSetKernelArg(kernel_2, 4, sizeof(Pressure_BUFF), ptrInput);
clEnqueueNDRangeKernel(queue_2, kernel_2, 1, NULL,&work_units_per_kernel, NULL, 0, NULL, NULL);
clFinish(queue_2);//Terminar de calcular
cl_mem *ptrTpm = ptrInput;
ptrInput = ptrOutput;
ptrOutput = ptrTpm;
}
clEnqueueReadBuffer(queue_2, Pressure_OUT_BUFF, CL_TRUE, 0,sizeof(Pressure), Pressure, 0, NULL, NULL);
您不能仅仅更改输入存储器缓冲区,使输出未触及。否则数据的输入与输出相同。
最干净的方法是使用2个内核,因此您无需每次致电Setargs并完成。
//Create 2 buffers, A and B
bufA = clCreateBuffer(...);
bufB = clCreateBuffer(...);
//Create 2 kernels with same parameters
kernelAB = clCreateKernel(...);
kernelBA = clCreateKernel(...);
//Set one to input A output B, and the other in reverse
clSetKernelArgs(kernelAB, in, bufferA);
clSetKernelArgs(kernelAB, out, bufferB);
clSetKernelArgs(kernelBA, in, bufferB);
clSetKernelArgs(kernelBA, out, bufferA);
for(int i = 0; i<Interaction_per_frame; i++){
clEnqueueNDRangeKernel(queue_2, i%2 ? kernelBA : kernelAB, 1, NULL,&work_units_per_kernel, NULL, 0, NULL, NULL);
}
clEnqueueReadBuffer(queue_2, Interaction_per_frame%2 ? bufferB : bufferA, CL_TRUE, 0,sizeof(Pressure), Pressure, 0, NULL, NULL);
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- 呼叫运营商<<临时
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- OpenCL仅在循环呼叫时停止运行
- 在运行时呼叫处理constexPR.C
- Windows Phone 8.1运行时-如何获取呼叫信息,如传入和传出呼叫的历史记录