static CALresult runNuStep(MWCALInfo* ci,
                           SeparationCALMem* cm,
                           const IntegralArea* ia,
                           const SeparationCALChunks* chunks,
                           CALint pollingMode,
                           CALuint nuStep)
{
    CALdomain domain;
    CALuint i;
    CALresult err = CAL_RESULT_OK;

    err = setNuKernelArgs(cm, ia, nuStep);
    if (err != CAL_RESULT_OK)
        return err;

    domain.x = 0;
    domain.width = ia->r_steps;

    for (i = 0; i < chunks->nChunkMu && err == CAL_RESULT_OK; ++i)
    {
        domain.y = chunks->chunkMuBorders[i];
        domain.height = chunks->chunkMuBorders[i + 1] - chunks->chunkMuBorders[i];

        mw_begin_critical_section();
        err = runKernel(ci, &domain, pollingMode, chunks->chunkWaitTime);
        mw_end_critical_section();
    }

    return err;
}
static cl_int runNuStep(CLInfo* ci, const IntegralArea* ia, const RunSizes* runSizes, cl_uint nu_step)
{
    cl_uint i;
    cl_int err = CL_SUCCESS;
    size_t offset[1];

    err = setNuKernelArgs(ia, nu_step);
    if (err != CL_SUCCESS)
    {
        mw_printf("Failed to set nu kernel argument\n");
        return err;
    }

    mw_begin_critical_section();

    offset[0] = 0;
    for (i = 0; i < runSizes->nChunk && err == CL_SUCCESS; ++i)
    {
        err = runIntegralKernel(ci, runSizes, offset);
        checkQuitRequest();         /* Kernel has finished by now */
        offset[0] += runSizes->global[0];
    }

    mw_end_critical_section();

    return err;
}