【问题标题】:OpenCL stops running only while call in a loopOpenCL 仅在循环调用时停止运行
【发布时间】:2017-11-26 10:24:14
【问题描述】:

当我尝试将数据循环回内核函数时,我的代码中断,经过几次迭代后它停止工作,只给出 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);

【问题讨论】:

  • 使用 clEnqueueCopyBuffer 代替 cl_mem 杂耍。

标签: c++ visual-studio kernel opencl


【解决方案1】:

您不能只更改输入内存缓冲区而保持输出不变。 否则数据的输入与输出相同。

最简洁的方法是使用 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);

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2017-03-16
    • 2015-05-17
    相关资源
    最近更新 更多