Hi,
I am using a test program for compiling a boost::bind in Intel MIC(Xeom
Phi). Here are the details of the code and platform on which it is
compiled. I am using thread building blocks in my code, but the following
code does not contain any TBB threads. The errors in my test code below and
original code are same.
Compiler : Intel 13.0.1 / intel 14.0.1 SP1 Update 3 (latest from intel
composer XE trial version) I am using our lab's compiler installed on a
cluster. The TBB is installed in my home directory. boost 1.55 is also
installed in my home location.
Compiled for MIC: icpc -mmic -L/home/aniketnp/tbb42_20140122oss/lib/mic
-std=c++11 -I/home/aniketnp/boost_1_55_0
-I/home/aniketnp/tbb42_20140122oss/include test.cpp
Scenario: a functor takes 2 arguments in its operator()() by using a
boost::bind() method. The operator()() method contains a function which
uses comparisons ( < or > ) using if-else logic. The error pops up here.
Here is the following code.
#include <iostream>
#include <boost/bind.hpp>
using namespace std;
struct Info_t {
int start;
int end;
Info_t(int s=0,int e=0) : start(s), end(e) { }
};
template <typename T, typename time>
void process_info(const T& info1, const T& info2, const time& t) {
//the below gives compiler error
* if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )*
std::cout << "yess error with mic" << std::endl;
//the below if works fine
if ((info1.start < info2.end) && (info2.end > info1.end))
std::cout << "no error at all" << std::endl;
}
template<typename Time>
struct my_functor {
public:
my_functor() { }
my_functor(Time& time_) : time(time_) { }
typedef void result_type;
template<typename info_t>
void operator()(const info_t& info1, const info_t& info2) {
const auto& i1 = info1;
const auto& i2 = info2;
process_info<info_t, Time> (i1,i2, time);
}
private:
Time& time;
};
int main() {
Info_t i1(10,2);
Info_t i2(2,10);
int t = 1;
auto func = boost::bind( my_functor<int>(t), _1, _2 );
func(i1,i2);
return 0;
}
test.cpp(16): error: expression must have a constant value
if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )
^
detected during:
instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48
test.cpp(16): error: this operator is not allowed in a template
argument expression
if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )
^
detected during:
instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48
test.cpp(16): error: expected a ">"
if ((info1.start < info2.end) && (info2.end > info1.end) &&
(info1.end < info2.start) )
^
detected during:
instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 48
As a workaround, I try to do this, but same error
if ((info2.start < info2.end) && (info2.end > info1.end) )
{
if ( info1.end < info2.start)
//do something
}
// error is propagated towards inner if loop
test.cpp(17): error: expression must have a constant value
if ( info1.end < info2.start)
^
detected during:
instantiation of "void my_functor<Time>::operator()(const
info_t &, const info_t &) [with Time=int, info_t=Info_t]" at line 313
of "/home/aniketnp/boost_1_55_0/boost/bind/bind.hpp"
instantiation of "void boost::_bi::list2<A1,
A2>::operator()(boost::_bi::type<void>, F &, A &, int) [with
A1=boost::arg<1>, A2=boost::arg<2>, F=my_functor<int>,
A=boost::_bi::list2<Info_t &, Info_t &>]" at line 61 of
"/home/aniketnp/boost_1_55_0/boost/bind/bind_template.hpp"
instantiation of "boost::_bi::bind_t<R, F, L>::result_type
boost::_bi::bind_t<R, F, L>::operator()(A1 &, A2 &) [with
R=boost::_bi::unspecified, F=my_functor<int>,
L=boost::_bi::list2<boost::arg<1>, boost::arg<2>>, A1=Info_t,
A2=Info_t]" at line 49
test.cpp(17): error: this operator is not allowed in a template
argument expression
(rest error is the same)
-------------------------------------------------------------------------------------------------
Now, if I compile it without " -mmic " flag, then there is no compiler errors.
I compile with this : icpc
-L/home/aniketnp/tbb42_20140122oss/lib/intel64/gcc4.4 -std=c++11
-I/home/aniketnp/boost_1_55_0
-I/home/aniketnp/tbb42_20140122oss/include test.cpp
I dont get any error. It compiles and runs fine.
Any thoughts ? Please let me know.
--
Thanks and regards,
Aniket Pugaonkar