Я хотел бы использовать boost::compute and boost::range
вместе, как показано ниже, но если я раскомментирую #include <boost/range/combine.hpp>
линия я получаю сообщение о том, что boost::compute::zip_iterator
а также boost::iterators::zip_iterator
неоднозначны. Есть ли способ обойти это, чтобы я мог использовать boost::compute
а также boost::range
вместе в одном файле cpp? Я использую на Windows vs2015 64bit. Повышение 1.67.0.
Обновление: я обнаружил, что такая же ошибка возникает, если я пытаюсь включить boost/iterator/zip_iterator.hpp
вместо boost/range/combine.hpp
, так что это не относится к библиотеке Boost Range.
Код:
#include <vector>
#include <iostream>
#include <algorithm>
//#include <boost/range/combine.hpp>
#include <boost/compute/lambda.hpp>
#include <boost/compute/functional/math.hpp>
#include <boost/compute/container/vector.hpp>
#include <boost/compute/algorithm/transform.hpp>
namespace compute = boost::compute;
using compute::float4_;
using compute::lambda::_1;
using compute::lambda::_2;
using compute::lambda::distance;
int main()
{
// get default device and setup context
compute::device device = compute::system::default_device();
compute::context context(device);
compute::command_queue queue(context, device);
// generate random data on the host
std::vector<float4_> a(10000);
std::vector<float4_> b(10000);
std::vector<float> r(10000);
std::generate((float*)a.data(), (float*)(a.data() + a.size()), rand);
std::generate((float*)b.data(), (float*)(b.data() + b.size()), rand);
// create a vector on the device
compute::vector<float4_> _a(a.size(), context);
compute::vector<float4_> _b(b.size(), context);
compute::vector<float> _r(r.size(), context);
// transfer data from the host to the device
compute::copy(a.begin(), a.end(), _a.begin(), queue);
compute::copy(b.begin(), b.end(), _b.begin(), queue);
boost::compute::transform(
_a.begin(), _a.end(),
_b.begin(),
_r.begin(),
distance(_1, _2),
queue
);
// copy values back to the host
compute::copy(_r.begin(), _r.end(), r.begin(), queue);
for (int i = 0; i < a.size(); ++i)
{
float4_ va = a[i];
float4_ vb = b[i];
float vr = r[i];
float e = std::sqrt(std::pow(va[0] - vb[0], 2) +
std::pow(va[1] - vb[1], 2) +
std::pow(va[2] - vb[2], 2) +
std::pow(va[3] - vb[3], 2));
std::cout << std::setprecision(12);
if (std::abs(e - vr) > 1e-2)
std::cout << e << " != " << vr << "\n";
}
return 0;
}
Ошибка:
1> —— Началась сборка: Проект: демо, Конфигурация: Отладка x64 ——
1> demo.cpp 1> Этот заголовок является подробностью реализации и предназначен для
обратная совместимость.
1> C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / алгоритм / transform.hpp (67):
ошибка C2668: ‘boost :: compute :: make_zip_iterator’: неоднозначный вызов
перегруженная функция 1>
C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / итератор / zip_iterator.hpp (276):
примечание: может быть
«Повышение :: :: zip_iterator вычислений, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type >>
повышение :: вычислим :: make_zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание: : кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, форсирует :: кортежи :: null_type >> (IteratorTuple)»
1> с 1> [1>
T = boost :: compute :: float4_, 1>
IteratorTuple = повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>
1>] 1>
C: \ local \ boost_1_67_0 \ boost / iterator / zip_iterator.hpp (357): примечание: или
«Подталкивание :: итераторы :: zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type >>
повышение :: итераторы :: make_zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание: : кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, форсирует :: кортежи :: null_type >> (IteratorTuple)»
[найдено с помощью аргумент-зависимого поиска] 1> с 1> [
1> T = boost :: compute :: float4_, 1>
IteratorTuple = повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>
1>] 1>
C: \ local \ boost_1_67_0 \ boost / compute /gorithm / transform.hpp (67): примечание:
при попытке сопоставить список аргументов
«(Повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>)»
1> с 1> [1>
T = boost :: compute :: float4_ 1>] 1>
C: \ workspaces \ compute_test \ src \ demo.cpp (45): примечание: см. Ссылку на
создание шаблона функции ‘OutputIterator
повышение :: :: вычисления преобразования, повышение :: :: buffer_iterator вычислений, повышение :: :: buffer_iterator вычислений, повышение :: :: вычислить лямбда :: выражение> (InputIterator1, InputIterator1, InputIterator2, OutputIterator, BinaryOperator, повышение :: Compute :: command_queue
&) ‘компилируется 1> с 1> [1>
OutputIterator = boost :: compute :: buffer_iterator, 1>
T = boost :: compute :: float4_, 1>
Expr = повышение :: прото :: exprns _ :: basic_expr, 0 >>, Const
повышение :: :: вычислить лямбда :: выражение>, 0 >>
&, Const
повышение :: :: вычислить лямбда :: выражение>, 0 >>
&>, 3>, 1>
InputIterator1 = подталкивание :: :: вычислить buffer_iterator,
1>
InputIterator2 = подталкивание :: :: вычислить buffer_iterator,
1>
BinaryOperator = подталкивание :: вычислить :: лямбда :: выражение, 0 >>, Const
повышение :: :: вычислить лямбда :: выражение>, 0 >>
&, Const
повышение :: :: вычислить лямбда :: выражение>, 0 >>
&>, 3 >> 1>] 1> C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / алгоритм / transform.hpp (68):
ошибка C2668: ‘boost :: compute :: make_zip_iterator’: неоднозначный вызов
перегруженная функция 1>
C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / итератор / zip_iterator.hpp (276):
примечание: может быть
«Повышение :: :: zip_iterator вычислений, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type >>
повышение :: вычислим :: make_zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание: : кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, форсирует :: кортежи :: null_type >> (IteratorTuple)»
1> с 1> [1>
T = boost :: compute :: float4_, 1>
IteratorTuple = повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>
1>] 1>
C: \ local \ boost_1_67_0 \ boost / iterator / zip_iterator.hpp (357): примечание: или
«Подталкивание :: итераторы :: zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type >>
повышение :: итераторы :: make_zip_iterator, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, подталкивание: : кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, форсирует :: кортежи :: null_type >> (IteratorTuple)»
[найдено с помощью аргумент-зависимого поиска] 1> с 1> [
1> T = boost :: compute :: float4_, 1>
IteratorTuple = повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>
1>] 1>
C: \ local \ boost_1_67_0 \ boost / compute /gorithm / transform.hpp (68): примечание:
при попытке сопоставить список аргументов
«(Повышение :: кортежи :: кортеж, повышение :: :: buffer_iterator вычислений, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type, повышение :: кортежи :: null_type>)»
1> с 1> [1>
T = boost :: compute :: float4_ 1>] 1> C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / алгоритм / transform.hpp (72):
ошибка C2672: «преобразование»: не найдена соответствующая перегруженная функция
1> C: \ Local \ boost_1_67_0 \ подталкивание / вычислить / алгоритм / transform.hpp (72):
ошибка C2780: ‘OutputIterator
повышение :: вычислим :: преобразование (InputIterator1, InputIterator1, InputIterator2, OutputIterator, BinaryOperator, повышение :: :: command_queue вычисления
&) ‘: ожидает 6 аргументов — 4 при условии 1>
C: \ local \ boost_1_67_0 \ boost / compute /gorithm / transform.hpp (55): примечание:
смотрите объявление ‘boost :: compute :: transform’
========== Построить: 0 успешно выполнено,1 не удалось, 2 обновлено, 0 пропущено ==========
Краткосрочное исправление заключается в изменении boost/compute/algorithm/transform.hpp
, Измените оба звонка на make_zip_iterator
в ::boost::compute::make_zip_iterator
, Это квалифицирует вызов, чтобы избежать зависимого от аргумента поиска.
Обновление: это исправлено в # 790
Других решений пока нет …