Skip to content

transform algorithm with constant iterator #507

Open
@jpola

Description

@jpola

My tests revealed that when using constant iterator tupled and zipped gives segfault.
Here is the code which shows that:

#include <boost/compute/functional.hpp>
#include <boost/compute/buffer.hpp>
#include <boost/compute/container/vector.hpp>
#include <boost/compute/iterator/buffer_iterator.hpp>
#include <boost/compute/iterator/constant_iterator.hpp>
#include <boost/compute/iterator/zip_iterator.hpp>
#include <boost/compute/algorithm/transform.hpp>
#include <boost/tuple/tuple.hpp>



int main (int argc, const char* argv[])
{ 
    namespace compute = boost::compute;

try {
    int size = 128;
    compute::vector<float> xVector (size, 1.f);
    compute::vector<float> yVector (size, 2.f);
    compute::vector<float> zVector (size, 3.f);

    compute::vector<float> rVector (size, 0.f);

        BOOST_COMPUTE_FUNCTION(float, function_tuple_3, (boost::tuple<float, float, float> t),
           {
                return boost_tuple_get(t, 0);
           });
        BOOST_COMPUTE_FUNCTION(float, function_tuple_2, (boost::tuple<float, float> t),
           {
                return boost_tuple_get(t, 0);
           });


    /*This was my original code where I found the bug*/
    /* 
        compute::transform(
                    //first
                    compute::make_zip_iterator(
                        boost::make_tuple(
                            xVector.begin(),
                yVector.begin(),
                //zVector.begin()  //when using zVector instead of constant_iterator it is working correctly.
                            compute::make_constant_iterator<float>(4.f)
                            )
                        ),
                    //last
                    compute::make_zip_iterator(
                        boost::make_tuple(
                xVector.end(),
                yVector.end(),
                //zVector.end()  // change it here accordingly
                            compute::make_constant_iterator<float>(4.f, size)
                            )
                        ),

                    rVector.begin(),
                    //function
                    function_tuple_3
                    );
    */

    /* when not zipping constant iterator it seems fine */
    /*  
    compute::transform(compute::make_constant_iterator<float>(4.f),
            compute::make_constant_iterator<float>(4.f, size),
            rVector.begin(),
            compute::identity<float>()
    );
    */

    /* when start to zip it, program crashes */
    compute::transform(
            compute::make_zip_iterator(
                boost::make_tuple(
                    compute::make_constant_iterator<float>(4.f),
                    compute::make_constant_iterator<float>(4.f)
                )
            ),
            compute::make_zip_iterator(
                boost::make_tuple(
                    compute::make_constant_iterator<float>(4.f, size),
                    compute::make_constant_iterator<float>(4.f, size)
                )
            ),
            rVector.begin(),
            function_tuple_2
    );
    }
    catch (compute::opencl_error &err)
    {
        std::cerr << err.what() << std::endl;
    return -1;
    }
    catch (...)
    {
        std::cerr << "Boost compute failed with transforn operation" << std::endl;
        return -2;
    }
return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions