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.