I wrote this simple program to learn how to use Boost::Compute. The program failed to build on Windows, but builds without any errors on Linux. If I modify the program to only operate on one vector, it works fine. On Windows I'm using vcpkg to pull in both Boost::Compute as well as the OpenCL SDK and I'm using Visual Studio 2022 to build the project.
#define CL_TARGET_OPENCL_VERSION 300 #include <random> #include <vector> #include <boost/compute/core.hpp> #include <boost/compute/lambda.hpp> #include <boost/compute/algorithm/transform.hpp> #include <boost/compute/container/vector.hpp> std::mt19937 rng{ std::random_device()() }; std::uniform_int_distribution<> dist(1); namespace compute = boost::compute; using namespace boost::compute::lambda; int GetRandomNumber() { return dist(rng); } int main(int argc, char* argv[]) { const auto device = compute::system::default_device(); const compute::context context(device); compute::command_queue commandQueue(context, device); std::vector<int> hostVector1(10000); std::vector<int> hostVector2(10000); std::vector<int> hostResultVector(10000); std::ranges::generate(hostVector1, GetRandomNumber); std::ranges::generate(hostVector2, GetRandomNumber); compute::vector<int> deviceVector1(hostVector1.size(), context); compute::vector<int> deviceVector2(hostVector2.size(), context); compute::vector<int> deviceResultVector(hostResultVector.size(), context); compute::copy(hostVector1.begin(), hostVector1.end(), deviceVector1.begin(), commandQueue); compute::copy(hostVector2.begin(), hostVector2.end(), deviceVector2.begin(), commandQueue); transform(deviceVector1.begin(), deviceVector1.end(), deviceVector2.begin(), deviceResultVector.begin(), _1 + _2, commandQueue); compute::copy(deviceResultVector.begin(), deviceResultVector.end(), hostResultVector.begin(), commandQueue); return 0; } Here is the build output: Build started at 11:13 PM... 1>------ Build started: Project: BoostComputeTest, Configuration: Debug x64 ------ 1>Main.cpp 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): error C2039: 'get_buffer': is not a member of 'boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<T>,boost::compute::buffer_iterator<T>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>' 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): error C2039: with 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): error C2039: [ 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): error C2039: T=int 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): error C2039: ] 1>(compiling source file 'Main.cpp') 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\zip_iterator.hpp(172,7): 1> see declaration of 'boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<T>,boost::compute::buffer_iterator<T>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>' 1> with 1> [ 1> T=int 1> ] 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,53): 1> the template instantiation context (the oldest one first) is 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\Main.cpp(40,2): 1> see reference to function template instantiation 'OutputIterator boost::compute::transform<boost::compute::buffer_iterator<T>,boost::compute::buffer_iterator<T>,boost::compute::buffer_iterator<T>,boost::compute::lambda::expression<Expr>>(InputIterator1,InputIterator1,InputIterator2,OutputIterator,BinaryOperator,boost::compute::command_queue &)' being compiled 1> with 1> [ 1> OutputIterator=boost::compute::buffer_iterator<int>, 1> T=int, 1> Expr=boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>, 1> InputIterator1=boost::compute::buffer_iterator<int>, 1> InputIterator2=boost::compute::buffer_iterator<int>, 1> BinaryOperator=boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>> 1> ] 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\algorithm\transform.hpp(75,12): 1> see reference to function template instantiation 'OutputIterator boost::compute::transform<boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<T>,boost::compute::buffer_iterator<T>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>,OutputIterator,boost::compute::detail::unpacked<BinaryOperator>>(InputIterator,InputIterator,OutputIterator,UnaryOperator,boost::compute::command_queue &)' being compiled 1> with 1> [ 1> OutputIterator=boost::compute::buffer_iterator<int>, 1> T=int, 1> BinaryOperator=boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>>, 1> InputIterator=boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<int>,boost::compute::buffer_iterator<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>, 1> UnaryOperator=boost::compute::detail::unpacked<boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>>> 1> ] 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\algorithm\transform.hpp(48,34): 1> see reference to class template instantiation 'boost::compute::transform_iterator<InputIterator,UnaryOperator>' being compiled 1> with 1> [ 1> InputIterator=boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<int>,boost::compute::buffer_iterator<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>, 1> UnaryOperator=boost::compute::detail::unpacked<boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>>> 1> ] 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(175,15): 1> while compiling class template member function 'int boost::compute::transform_iterator<InputIterator,UnaryOperator>::dereference(void) const' 1> with 1> [ 1> InputIterator=boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<int>,boost::compute::buffer_iterator<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>, 1> UnaryOperator=boost::compute::detail::unpacked<boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>>> 1> ] 1> C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\iterator\iterator_facade.hpp(631,11): 1> see the first reference to 'boost::compute::transform_iterator<InputIterator,UnaryOperator>::dereference' in 'boost::iterators::iterator_core_access::dereference' 1> with 1> [ 1> InputIterator=boost::compute::zip_iterator<boost::tuples::tuple<boost::compute::buffer_iterator<int>,boost::compute::buffer_iterator<int>,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>, 1> UnaryOperator=boost::compute::detail::unpacked<boost::compute::lambda::expression<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::plus,boost::proto::argsns_::list2<const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<0>>,0>> &,const boost::compute::lambda::expression<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal,boost::proto::argsns_::term<boost::compute::lambda::placeholder<1>>,0>> &>,2>>> 1> ] 1>C:\Users\Dave\source\repos\BoostComputeTest\BoostComputeTest\vcpkg_installed\x64-windows\x64-windows\include\boost\compute\iterator\transform_iterator.hpp(177,32): error C2530: 'context': references must be initialized 1>(compiling source file 'Main.cpp') 1>Done building project "BoostComputeTest.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Build completed at 11:13 PM and took 03.315 seconds ========== Is there something I'm missing from my project configuration on Windows? Thanks, Dave F.
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org https://lists.boost.org/mailman/listinfo.cgi/boost-users