当我尝试将数据循环回内核函数时,我的代码中断,经过几次迭代后它停止工作,只给出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);
答案 0 :(得分:0)
您不能只改变输入内存缓冲区,保持输出不变。 否则,数据与输出具有相同的输入。
最简单的方法是使用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);