Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
29413 Discussions

IVF OpenMP THREADRIVATE and non OpenMP threads

jimdempseyatthecove
Honored Contributor III
688 Views
Steve, TimP, others,

This is not an show stopper as I have a work around

I have a multi-threaded OpenMP Fortran Application. That uses ThreadPrivate data. This is an app that I have been using/developing for years. The OpenMP threads do have seperate ThreadPrivate data. Recently I have had the need to introduce an additional non-OpenMP helperthread(s) created with CreateThread and I noticed a problem (un-expected quirk)....

I have been for years assuming the IVF ThreadPrivate was implimented similar to C __declspec(thread)... but apparently this is not so. Non-OpenMP threads created using CreateThread seem to inherit the VM of the thread issuing CreateThread, which means the new thread "inherits" the mapping of the thread private data of its creator and is not given the same VM of the creator with the exception of a different mapped portion of the VM for the thread private data (as is the case for __declspec(thread) ... declared data).

Is this a known issue? I this an issue?
Any comment on this would be appreciated.

Using IVF 11.0.066
This may be different in 12.n.mm

Jim Dempsey
0 Kudos
1 Reply
Steven_L_Intel1
Employee
688 Views
Jim,

Sorry that this took so long, but it took some time to find someone who knew the answer. It is not a simple question.

No, Intel's THREADPRIVATE is not the same as Microsoft's __declspec(thread), because the Microsoft implementation is buggy and often doesn't have the right semantics.

First, what do you want to accomplish? Is it:

1. You want each non-OpenMP thread to have its own copy of each OpenMP threadprivate variable

2. You want each non-OpenMP thread to have its own threadprivate copy compatible with __declspec(thread)

If it's 1, then try setting the environment variable KMP_FOREIGN_THREADS_THREADPRIVATE=true .

If it's 2, then compile with the option /Qopenmp-threadprivate:compat and define the environment variable as above. Be aware that the "compat" (MS) version various bugs and restrictions and may not work properly for you.

Last, I am not sure how well this works in 11.0.

Let me know what happens.
0 Kudos
Reply