forked from OSchip/llvm-project
OMP_WAIT_POLICY changes
This change has OMP_WAIT_POLICY=active to mean that threads will busy-wait in spin loops and virtually never go to sleep. OMP_WAIT_POLICY=passive now means that threads will immediately go to sleep inside a spin loop. KMP_BLOCKTIME was the previous mechanism to specify this behavior via KMP_BLOCKTIME=0 or KMP_BLOCKTIME=infinite, but the standard OpenMP environment variable should also be able to specify this behavior. Differential Revision: http://reviews.llvm.org/D18577 llvm-svn: 265339
This commit is contained in:
parent
8874ef7cf1
commit
50e8f18b52
|
@ -712,6 +712,8 @@ __kmp_stg_print_inherit_fp_control( kmp_str_buf_t * buffer, char const * name, v
|
|||
// KMP_LIBRARY, OMP_WAIT_POLICY
|
||||
// -------------------------------------------------------------------------------------------------
|
||||
|
||||
static char const *blocktime_str = NULL;
|
||||
|
||||
static void
|
||||
__kmp_stg_parse_wait_policy( char const * name, char const * value, void * data ) {
|
||||
|
||||
|
@ -725,9 +727,17 @@ __kmp_stg_parse_wait_policy( char const * name, char const * value, void * data
|
|||
|
||||
if ( wait->omp ) {
|
||||
if ( __kmp_str_match( "ACTIVE", 1, value ) ) {
|
||||
__kmp_library = library_turnaround;
|
||||
__kmp_library = library_turnaround;
|
||||
if ( blocktime_str == NULL ) {
|
||||
// KMP_BLOCKTIME not specified, so set default to "infinite".
|
||||
__kmp_dflt_blocktime = KMP_MAX_BLOCKTIME;
|
||||
}
|
||||
} else if ( __kmp_str_match( "PASSIVE", 1, value ) ) {
|
||||
__kmp_library = library_throughput;
|
||||
__kmp_library = library_throughput;
|
||||
if ( blocktime_str == NULL ) {
|
||||
// KMP_BLOCKTIME not specified, so set default to 0.
|
||||
__kmp_dflt_blocktime = 0;
|
||||
}
|
||||
} else {
|
||||
KMP_WARNING( StgInvalidValue, name, value );
|
||||
}; // if
|
||||
|
@ -5025,6 +5035,9 @@ __kmp_env_initialize( char const * string ) {
|
|||
}
|
||||
}; // for i
|
||||
|
||||
// We need to know if blocktime was set when processing OMP_WAIT_POLICY
|
||||
blocktime_str = __kmp_env_blk_var( & block, "KMP_BLOCKTIME" );
|
||||
|
||||
// Special case. If we parse environment, not a string, process KMP_WARNINGS first.
|
||||
if ( string == NULL ) {
|
||||
char const * name = "KMP_WARNINGS";
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
// RUN: %libomp-compile && env OMP_WAIT_POLICY=active %libomp-run active
|
||||
// RUN: %libomp-compile && env OMP_WAIT_POLICY=passive %libomp-run passive
|
||||
//
|
||||
// OMP_WAIT_POLICY=active should imply blocktime == INT_MAX
|
||||
// i.e., threads spin-wait forever
|
||||
// OMP_WAIT_POLICY=passive should imply blocktime == 0
|
||||
// i.e., threads immediately sleep
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "omp_testsuite.h"
|
||||
|
||||
void usage() {
|
||||
fprintf(stderr, "usage: omp_wait_policy active|passive\n");
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int blocktime, retval=1;
|
||||
const char* env_var_value;
|
||||
|
||||
if (argc != 2) {
|
||||
usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
blocktime = kmp_get_blocktime();
|
||||
|
||||
env_var_value = argv[1];
|
||||
if (!strcmp(env_var_value, "active")) {
|
||||
retval = (blocktime != INT_MAX);
|
||||
} else if (!strcmp(env_var_value, "passive")) {
|
||||
retval = (blocktime != 0);
|
||||
} else {
|
||||
usage();
|
||||
retval = 1;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
Loading…
Reference in New Issue