Files
tbb/build/detect.js
T
Hans Johnson e32d75f876 ENH: Update to TBB 2017 (2016-09-08 release)
The new release TBB is now under a new more
open license.
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

The list of most significant changes made over time in
Intel(R) Threading Building Blocks (Intel(R) TBB).

Intel TBB 2017
TBB_INTERFACE_VERSION == 9100

Changes (w.r.t. Intel TBB 4.4 Update 5):

- static_partitioner class is now a fully supported feature.
- async_node class is now a fully supported feature.
- Improved dynamic memory allocation replacement on Windows* OS to skip
    DLLs for which replacement cannot be done, instead of aborting.
- Intel TBB no longer performs dynamic memory allocation replacement
    for Microsoft* Visual Studio* 2008.
- For 64-bit platforms, quadrupled the worst-case limit on the amount
    of memory the Intel TBB allocator can handle.
- Added TBB_USE_GLIBCXX_VERSION macro to specify the version of GNU
    libstdc++ when it cannot be properly recognized, e.g. when used
    with Clang on Linux* OS. Inspired by a contribution from David A.
- Added graph/stereo example to demostrate tbb::flow::async_msg.
- Removed a few cases of excessive user data copying in the flow graph.
- Reworked split_node to eliminate unnecessary overheads.
- Added support for C++11 move semantics to the argument of
    tbb::parallel_do_feeder::add() method.
- Added C++11 move constructor and assignment operator to
    tbb::combinable template class.
- Added tbb::this_task_arena::max_concurrency() function and
    max_concurrency() method of class task_arena returning the maximal
    number of threads that can work inside an arena.
- Deprecated tbb::task_arena::current_thread_index() static method;
    use tbb::this_task_arena::current_thread_index() function instead.
- All examples for commercial version of library moved online:
    https://software.intel.com/en-us/product-code-samples. Examples are
    available as a standalone package or as a part of Intel(R) Parallel
    Studio XE or Intel(R) System Studio Online Samples packages.

Changes affecting backward compatibility:

- Renamed following methods and types in async_node class:
    Old                   New
    async_gateway_type => gateway_type
    async_gateway()    => gateway()
    async_try_put()    => try_put()
    async_reserve()    => reserve_wait()
    async_commit()     => release_wait()
- Internal layout of some flow graph nodes has changed; recompilation
    is recommended for all binaries that use the flow graph.

Preview Features:

- Added template class streaming_node to the flow graph API. It allows
    a flow graph to offload computations to other devices through
    streaming or offloading APIs.
- Template class opencl_node reimplemented as a specialization of
    streaming_node that works with OpenCL*.
- Added tbb::this_task_arena::isolate() function to isolate execution
    of a group of tasks or an algorithm from other tasks submitted
    to the scheduler.

Bugs fixed:

- Added a workaround for GCC bug #62258 in std::rethrow_exception()
    to prevent possible problems in case of exception propagation.
- Fixed parallel_scan to provide correct result if the initial value
    of an accumulator is not the operation identity value.
- Fixed a memory corruption in the memory allocator when it meets
    internal limits.
- Fixed the memory allocator on 64-bit platforms to align memory
    to 16 bytes by default for all allocations bigger than 8 bytes.
- As a workaround for crashes in the Intel TBB library compiled with
    GCC 6, added -flifetime-dse=1 to compilation options on Linux* OS.
- Fixed a race in the flow graph implementation.

Open-source contributions integrated:

- Enabling use of C++11 'override' keyword by Raf Schietekat.

------------------------------------------------------------------------
2016-09-28 21:12:48 +02:00

182 lines
5.6 KiB
JavaScript

// Copyright (c) 2005-2016 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//
//
//
function doWork() {
var WshShell = WScript.CreateObject("WScript.Shell");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var tmpExec;
tmpExec = WshShell.Run("cmd /c echo int main(){return 0;} >detect.c", 0, true);
// The next block deals with GCC (MinGW)
if ( WScript.Arguments.Count() > 1 && WScript.Arguments(1) == "gcc" ) {
if ( WScript.Arguments(0) == "/arch" ) {
// Get predefined macros
tmpExec = WshShell.Run("cmd /C gcc -dM -E detect.c > detect.map", 0, true);
var file = fso.OpenTextFile("detect.map", 1, 0);
var defs = file.readAll();
file.Close();
//detect target architecture
var intel64=/x86_64|amd64/mgi;
var ia32=/i386/mgi;
if ( defs.match(intel64) ) {
WScript.Echo( "intel64" );
} else if ( defs.match(ia32) ) {
WScript.Echo( "ia32" );
} else {
WScript.Echo( "unknown" );
}
} else {
tmpExec = WshShell.Exec("gcc -dumpversion");
var gcc_version = tmpExec.StdOut.ReadLine();
if ( WScript.Arguments(0) == "/runtime" ) {
WScript.Echo( "mingw"+gcc_version );
}
else if ( WScript.Arguments(0) == "/minversion" ) {
// Comparing strings, not numbers; will not work for two-digit versions
if ( gcc_version >= WScript.Arguments(2) ) {
WScript.Echo( "ok" );
} else {
WScript.Echo( "fail" );
}
}
}
return;
}
//Compile binary
tmpExec = WshShell.Exec("cl /MD detect.c /link /MAP");
while ( tmpExec.Status == 0 ) {
WScript.Sleep(100);
}
//compiler banner that includes version and target arch was printed to stderr
var clVersion = tmpExec.StdErr.ReadAll();
if ( WScript.Arguments(0) == "/arch" ) {
//detect target architecture
var intel64=/AMD64|EM64T|x64/mgi;
var ia32=/[80|\s]x86/mgi;
var arm=/ARM/mgi;
if ( clVersion.match(intel64) ) {
WScript.Echo( "intel64" );
} else if ( clVersion.match(ia32) ) {
WScript.Echo( "ia32" );
} else if ( clVersion.match(arm) ) {
WScript.Echo( "armv7" );
} else {
WScript.Echo( "unknown" );
}
return;
}
if ( WScript.Arguments(0) == "/runtime" ) {
//read map-file
var map = fso.OpenTextFile("detect.map", 1, 0);
var mapContext = map.readAll();
map.Close();
//detect runtime
var vc71=/MSVCR71\.DLL/mgi;
var vc80=/MSVCR80\.DLL/mgi;
var vc90=/MSVCR90\.DLL/mgi;
var vc100=/MSVCR100\.DLL/mgi;
var vc110=/MSVCR110\.DLL/mgi;
var vc120=/MSVCR120\.DLL/mgi;
var vc140=/VCRUNTIME140\.DLL/mgi;
var psdk=/MSVCRT\.DLL/mgi;
if ( mapContext.match(vc71) ) {
WScript.Echo( "vc7.1" );
} else if ( mapContext.match(vc80) ) {
WScript.Echo( "vc8" );
} else if ( mapContext.match(vc90) ) {
WScript.Echo( "vc9" );
} else if ( mapContext.match(vc100) ) {
WScript.Echo( "vc10" );
} else if ( mapContext.match(vc110) ) {
WScript.Echo( "vc11" );
} else if ( mapContext.match(vc120) ) {
WScript.Echo( "vc12" );
} else if ( mapContext.match(vc140) ) {
WScript.Echo( "vc14" );
} else {
WScript.Echo( "unknown" );
}
return;
}
if ( WScript.Arguments(0) == "/minversion" ) {
var compiler_version;
if ( WScript.Arguments(1) == "cl" ) {
compiler_version = clVersion.match(/Compiler Version ([0-9.]+)\s/mi)[1];
// compiler_version is in xx.xx.xxxxx.xx format, i.e. a string.
// It will compare well with major.minor versions where major has two digits,
// which is sufficient as the versions of interest start from 13 (for VC7).
} else if ( WScript.Arguments(1) == "icl" ) {
// Get predefined ICL macros
tmpExec = WshShell.Run("cmd /C icl /QdM /E detect.c > detect.map", 0, true);
var file = fso.OpenTextFile("detect.map", 1, 0);
var defs = file.readAll();
file.Close();
// In #define __INTEL_COMPILER XXYY, XX is the major ICL version, YY is minor
compiler_version = defs.match(/__INTEL_COMPILER[ \t]*([0-9]+).*$/mi)[1]/100;
// compiler version is a number; it compares well with another major.minor
// version number, where major has one, two, and perhaps more digits (9.1, 11, etc).
}
if ( compiler_version >= WScript.Arguments(2) ) {
WScript.Echo( "ok" );
} else {
WScript.Echo( "fail" );
}
return;
}
}
function doClean() {
var fso = new ActiveXObject("Scripting.FileSystemObject");
// delete intermediate files
if ( fso.FileExists("detect.c") )
fso.DeleteFile ("detect.c", false);
if ( fso.FileExists("detect.obj") )
fso.DeleteFile ("detect.obj", false);
if ( fso.FileExists("detect.map") )
fso.DeleteFile ("detect.map", false);
if ( fso.FileExists("detect.exe") )
fso.DeleteFile ("detect.exe", false);
if ( fso.FileExists("detect.exe.manifest") )
fso.DeleteFile ("detect.exe.manifest", false);
}
if ( WScript.Arguments.Count() > 0 ) {
try {
doWork();
} catch( error ) {
WScript.Echo( "unknown" );
}
doClean();
} else {
WScript.Echo( "Supported options:\n"
+ "\t/arch [compiler]\n"
+ "\t/runtime [compiler]\n"
+ "\t/minversion compiler version" );
}