Open
Description
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;
}