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:
Jonathan Peyton 2016-04-04 19:38:32 +00:00
parent 8874ef7cf1
commit 50e8f18b52
2 changed files with 55 additions and 2 deletions

View File

@ -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";

View File

@ -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;
}