Esempio n. 1
0
cl_int setupSeparationCL(CLInfo* ci,
                         const AstronomyParameters* ap,
                         const IntegralArea* ias,
                         const CLRequest* clr)
{
    char* compileFlags;
    cl_bool useILKernel;
    cl_int err = MW_CL_ERROR;
    const char* kernSrc = (const char*) probabilities_kernel_cl;
    size_t kernSrcLen = probabilities_kernel_cl_len;

    const char* summarizationKernSrc = (const char*) summarization_kernel_cl;
    size_t summarizationKernSrcLen = summarization_kernel_cl_len;


    err = mwSetupCL(ci, clr);
    if (err != CL_SUCCESS)
    {
        mwPerrorCL(err, "Error getting device and context");
        return err;
    }

    if (!separationCheckDevCapabilities(&ci->di))
    {
        return MW_CL_ERROR;
    }

    useILKernel = usingILKernelIsAcceptable(ci, ap, clr);
    compileFlags = getCompilerFlags(ci, ap, useILKernel);
    if (!compileFlags)
    {
        mw_printf("Failed to get CL compiler flags\n");
        return MW_CL_ERROR;
    }

    if (clr->verbose)
    {
        mw_printf("\nCompiler flags:\n%s\n\n", compileFlags);
    }

    integrationProgram = mwCreateProgramFromSrc(ci, 1, &kernSrc, &kernSrcLen, compileFlags);
    if (!integrationProgram)
    {
        mw_printf("Error creating integral program from source\n");
        err = MW_CL_ERROR;
        goto setup_exit;
    }

    summarizationProgram = mwCreateProgramFromSrc(ci, 1, &summarizationKernSrc, &summarizationKernSrcLen, compileFlags);
    if (!summarizationProgram)
    {
        mw_printf("Error creating summarization program from source\n");
        err = MW_CL_ERROR;
        goto setup_exit;
    }

    if (useILKernel)
    {
        mw_printf("Using AMD IL kernel\n");
        err = setProgramFromILKernel(ci, ap);
        if (err != CL_SUCCESS)
        {
            mw_printf("Failed to create IL kernel. Falling back to source kernel\n");
        }
    }

    if (err == CL_SUCCESS)
    {
        _separationKernel = mwCreateKernel(integrationProgram, "probabilities");
        _summarizationKernel = mwCreateKernel(summarizationProgram, "summarization");
        if (   !_separationKernel
            || !_summarizationKernel
            || setSummarizationWorkgroupSize(ci)
            || !separationCheckDevMemory(&ci->di, ap, ias))
        {
            err = MW_CL_ERROR;
        }
    }


setup_exit:
    free(compileFlags);

    return err;
}
Esempio n. 2
0
cl_int setupSeparationCL(CLInfo* ci,
                         const AstronomyParameters* ap,
                         const IntegralArea* ias,
                         const CLRequest* clr,
                         cl_int* useImages)
{
    cl_int err;
    char* compileFlags;
    char* kernelSrc;

    err = mwSetupCL(ci, clr);
    if (err != CL_SUCCESS)
    {
        mwCLWarn("Error getting device and context", err);
        return err;
    }

    err = mwGetDevInfo(&ci->di, ci->dev);
    if (err != CL_SUCCESS)
    {
        warn("Failed to get device info\n");
        return err;
    }

    if (clr->verbose)
    {
        mwPrintDevInfo(&ci->di);
    }
    else
    {
        mwPrintDevInfoShort(&ci->di);
    }

    if (!separationCheckDevCapabilities(&ci->di, ap, ias))
    {
        warn("Device failed capability check\n");
        return MW_CL_ERROR;
    }

    *useImages = *useImages && ci->di.imgSupport;

    compileFlags = getCompilerFlags(ap, &ci->di, *useImages);
    if (!compileFlags)
    {
        warn("Failed to get compiler flags\n");
        return MW_CL_ERROR;
    }

    kernelSrc = findKernelSrc();
    if (!kernelSrc)
    {
        warn("Failed to read CL kernel source\n");
        return MW_CL_ERROR;
    }

    warn("\nCompiler flags:\n%s\n\n", compileFlags);
    err = mwSetProgramFromSrc(ci, "mu_sum_kernel", (const char**) &kernelSrc, 1, compileFlags);

    freeKernelSrc(kernelSrc);
    free(compileFlags);

    if (err != CL_SUCCESS)
    {
        mwCLWarn("Error creating program from source", err);
        return err;
    }

    return CL_SUCCESS;
}