MultiBlockManagement3D extend( MultiBlockManagement3D const& management,
                               Box3D addedBulk, Box3D addedUniqueBulk )
{
    std::vector<plint> newIds;
    SparseBlockStructure3D resultStructure =
        extend( management.getSparseBlockStructure(), addedBulk, addedBulk, newIds );
    std::vector<plint> mpiProcesses(newIds.size()), localThreads(newIds.size());
    for (pluint iNew=0; iNew<newIds.size(); ++iNew) {
        // Default-attribute the newly created blocks to the main process.
        mpiProcesses[iNew] = global::mpi().bossId();
        localThreads[iNew] = 0;
    }
    return MultiBlockManagement3D (
            resultStructure,
            management.getThreadAttribution().extend (
                newIds, mpiProcesses, localThreads ),
            management.getEnvelopeWidth(),
            management.getRefinementLevel() );
}
Esempio n. 2
0
int SobelFilterImage::runCLKernels()
{
    cl_int status;

    cl::size_t<3> origin;
    origin[0] = 0;
    origin[1] = 0;
    origin[2] = 0;

    cl::size_t<3> region;
    region[0] = width;
    region[1] = height;
    region[2] = 1;

    cl::Event writeEvt;
    status = commandQueue.enqueueWriteImage(
                inputImage2D,
                CL_TRUE,
                origin,
                region,
                0,
                0,
                inputImageData,
                NULL,
                &writeEvt);
    CHECK_OPENCL_ERROR(status,
                       "CommandQueue::enqueueWriteImage failed. (inputImage2D)");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    cl_int eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = writeEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");

    }

    // Set appropriate arguments to the kernel
    // input buffer image
    status = kernel.setArg(0, inputImage2D);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager
    status = kernel.setArg(1, outputImage2D);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    /*
    * Enqueue a kernel run call.
    */
    cl::NDRange globalThreads(width, height);

    if (blockSizeX > width)
        blockSizeX = width;

    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                0,
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Enqueue Read Image
    origin[0] = 0;
    origin[1] = 0;
    origin[2] = 0;

    region[0] = width;
    region[1] = height;
    region[2] = 1;

    // Enqueue readBuffer
    cl::Event readEvt;
    status = commandQueue.enqueueReadImage(
                outputImage2D,
                CL_FALSE,
                origin,
                region,
                0,
                0,
                outputImageData,
                NULL,
                &readEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadImage failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = readEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS,
                    &eventStatus);
        CHECK_OPENCL_ERROR(status,
                           "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");

    }

    return 0;
}
int 
GaussianNoise::runCLKernels()
{
    cl_int status;
    cl_int eventStatus = CL_QUEUED;

    cl::Event writeEvt;
    status = commandQueue.enqueueWriteBuffer(
                inputImageBuffer,
                CL_FALSE,
                0,
                width * height * pixelSize,
                inputImageData,
                NULL,
                &writeEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueWriteBuffer() failed. (inputImageBuffer)");
    
    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = writeEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Set appropriate arguments to the kernel 

    // input buffer image 
    status = kernel.setArg(0, inputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager 
    status = kernel.setArg(1, outputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    // factor 
    status = kernel.setArg(2, factor);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (factor)");

    /* 
    * Enqueue a kernel run call.
    */

    // Each thread calculates 2 gaussian numbers 
    cl::NDRange globalThreads(width / 2, height);
    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                NULL, 
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    // Enqueue readBuffer
    cl::Event readEvt;
    status = commandQueue.enqueueReadBuffer(
                outputImageBuffer,
                CL_FALSE,
                0,
                width * height * pixelSize,
                outputImageData,
                NULL,
                &readEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadBuffer failed. (outputImageBuffer)");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = readEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    return SDK_SUCCESS;
}
int 
HDRToneMapping::runCLKernels()
{
    cl_int status;
    cl_int eventStatus = CL_QUEUED;

    if (deviceType.compare("gpu") == 0)
    {
        cl::Event mapEvt; 
        void *mapPtr = commandQueue.enqueueMapBuffer(inputImageBuffer, 
                                CL_FALSE,
                                CL_MAP_WRITE,
                                0,
                                width * height * numChannels * sizeof(cl_float),
                                NULL,
                                &mapEvt,
                                &status);
        CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueWriteBuffer() failed. (inputImageBuffer)");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = mapEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }

        memcpy(mapPtr, 
            input, 
            height * width * numChannels * sizeof(cl_float));

        cl::Event unMapEvt;

        status = commandQueue.enqueueUnmapMemObject(inputImageBuffer, 
                                mapPtr, 
                                NULL, 
                                &unMapEvt);
        CHECK_OPENCL_ERROR(status, "commandQueue.enqueueUnmapObject failed");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = unMapEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }
    }

    // input buffer image 
    status = kernel.setArg(0, inputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (inputImageBuffer)");

    // outBuffer imager 
    status = kernel.setArg(1, outputImageBuffer);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (outputImageBuffer)");

    // Average Luminance 
    status = kernel.setArg(2, averageLuminance);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (averageLuminance)");

    // Gamma 
    status = kernel.setArg(3, gammaPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (gammaPattanaik)");

    // C 
    status = kernel.setArg(4, cPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (cPattanaik)");

    // Delta 
    status = kernel.setArg(5, deltaPattanaik);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (deltaPattanaik)");

    // Width 
    status = kernel.setArg(6, width);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (width)");

    // numChannels 
    status = kernel.setArg(7, numChannels);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (numChannels)");

    // Height 
    status = kernel.setArg(8, height);
    CHECK_OPENCL_ERROR(status, "Kernel::setArg() failed. (height)");

    /* 
    * Enqueue a kernel run call.
    */

    cl::NDRange globalThreads(width, height);
    cl::NDRange localThreads(blockSizeX, blockSizeY);

    cl::Event ndrEvt;
    status = commandQueue.enqueueNDRangeKernel(
                kernel,
                cl::NullRange,
                globalThreads,
                localThreads,
                NULL, 
                &ndrEvt);
    CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueNDRangeKernel() failed.");

    status = commandQueue.flush();
    CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

    eventStatus = CL_QUEUED;
    while(eventStatus != CL_COMPLETE)
    {
        status = ndrEvt.getInfo<cl_int>(
                    CL_EVENT_COMMAND_EXECUTION_STATUS, 
                    &eventStatus);
        CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
    }

    if (deviceType.compare("gpu") == 0)
    {
        // Enqueue readBuffer
        cl::Event readEvt;
        status = commandQueue.enqueueReadBuffer(
                    outputImageBuffer,
                    CL_FALSE,
                    0,
                    width * height * numChannels * sizeof(cl_float),
                    output,
                    NULL,
                    &readEvt);
        CHECK_OPENCL_ERROR(status, "CommandQueue::enqueueReadBuffer failed. (outputImageBuffer)");

        status = commandQueue.flush();
        CHECK_OPENCL_ERROR(status, "cl::CommandQueue.flush failed.");

        eventStatus = CL_QUEUED;
        while(eventStatus != CL_COMPLETE)
        {
            status = readEvt.getInfo<cl_int>(
                        CL_EVENT_COMMAND_EXECUTION_STATUS, 
                        &eventStatus);
            CHECK_OPENCL_ERROR(status, "cl:Event.getInfo(CL_EVENT_COMMAND_EXECUTION_STATUS) failed.");
        }
    }
    return SDK_SUCCESS;
}