- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I am using the new tbb release within vs2010 and using icl 12.1. All builds are 64bit (win7).
I am trying to use the scalable_allocator construct method. I assume that because variadic templates are supported in icl 12.1,
I will be able to use the overloaded version of the function that forwrds arguments (variadic argument list).
However, the compiler does not "pick up". I was hoping that this would be activated:
#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT
template<typename... Args>
void construct(pointer p, Args&&... args)
#if __TBB_CPP11_STD_FORWARD_BROKEN
{ ::new((void *)p) T((args)...); }
#else
{ ::new((void *)p) T(std::forward<Args>(args)...); }
#endif
Am I looking at the right thing ? My understanding is that this is functionally equivalent to new _T( args...) . Am I wrong ?
(In this case, however, I do have a question on how it is possible to change the pointer when no indirection to it is provided in the argument list ).
Looking a bit more within the definition of __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT and __TBB_CPP11_RVALUE_REF_PRESENT
In the section I belive to be relevant for my setup, I read :
#if __INTEL_COMPILER
/** On Windows environment when using Intel C++ compiler with Visual Studio 2010*,
the C++0x features supported by Visual C++ 2010 are enabled by default
TODO: find a way to get know if c++0x mode is specified in command line on windows **/
#define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ && __VARIADIC_TEMPLATES
Variadic templates however, are not supported on the ms compiler that ships with vs2010 (version 1600).
Please, note that the macro __INTEL_COMPILER is well defined (the rest of the options come in the form of elif's and therefore are not touched ).
I assume that the macro __GXX_EXPERIMENTAL_CXX0X__ is not applicable to me ( gcc?) and the && just shortcuts any attempt to define
__VARIADIC_TEMPLATES by hand (btw, was not able to locate where this thing is defined, if not by the user ).
Can you please provide with a hint of how to bypass this issue and more generally issues of the same nature i.e. the config file not picking up the icl Cxx0x features ? (present in the previous tbb release as well, which prompted me to download the latest one).
Thank you in advance for your help,
Petros
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Update:
It looks like it is compiling w/out errors ( flag C++0x was not active, apologies ).
Still dont understand any of my questions though and would greatly appreciate some insight.
Thank you,
P-
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Update:
It seems that the questions I asked do require some answer in the end, since I mistakenly thought that things were OK ( usual template
compilation issue). Apologies (again ;) )
Hence,
Unless I manually overwrite all the tbb include files ( actually not include them, but include a proxy to them where I define things by hand)
the icl 12.1 variadic templates and rvalue references are not picked up ! Also I see that you explicitely determine that the std::forward is broken. Is it really so for the icl 12.1 ? (could not get to an answer on the web),
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can someone please respond on what is the proper way to employ c++0x features with tbb in windows using icl ?
Is this broken ?
TIA,
Petros
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Petros,
thanks for reporting it. Definitely deserve investigation. Will let you know the results.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Petros,
as a temporary workaround you can try modify tbb_config.h to look like this : (all the changes in the last line)
#if __INTEL_COMPILER
/** On Windows environment when using Intel C++ compiler with Visual Studio 2010*,
the C++0x features supported by Visual C++ 2010 are enabled by default
TODO: find a way to get know if c++0x mode is specified in command line on windows **/
#define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT ( __VARIADIC_TEMPLATES && (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER) )
As well, please note that you have to enable C++11 mode explicitly (specify /Qstd=c++0x compiler switch) as the variadic templates are not supported by the MSVC2010 and will not be silently turned on by Intel compiler.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Very doubtful workaround.
The reason being that, this is in the config workaround, which is included to a number of header files (actually most indirectly through the inclusion of some other file). If this is a trully header-only "library" then things would be OK. Is it though ?O/wise you will get messages amounting to that the lib file is prior to the included one.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Actually since they would belong to separate libs it would probably be OK. Thank you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Anton,
your recommendation from a few months back, found its way to the recent (Jun ) update release of tbb.
However there are some problems with it:
The macro __VARIADIC_TEMPLATES is not defined anywhere in the msvc environment. It does not seem to be defined as an intel compiler macro, as far as I can see ( maybe it is triggered internally by the C++0x flag ? I don't know. However it does not work !!!
It should better be :
#define__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT ( ( __VARIADIC_TEMPLATES && (__GXX_EXPERIMENTAL_CXX0X__ || _MSC_VER) ) ) || (_MSC_VER && __INTEL_COMPILER >=1210 ).
Also, the macro
__TBB_CPP11_STD_FORWARD_BROKEN
is incorrectly set for msvc2010 as in the <utility> (Ln 77 after the clause for C++0x on line 22) it is clearly defined !
Do I miss something?
Thank you for your help,
Petros

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page