Skip to content

Commit

Permalink
OMP_WAIT_POLICY changes
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jpeyton52 committed Apr 4, 2016
1 parent 8874ef7 commit 50e8f18
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
17 changes: 15 additions & 2 deletions openmp/runtime/src/kmp_settings.c
Expand Up @@ -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 ) {

Expand All @@ -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
Expand Down Expand Up @@ -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";
Expand Down
40 changes: 40 additions & 0 deletions openmp/runtime/test/env/omp_wait_policy.c
@@ -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;
}

0 comments on commit 50e8f18

Please sign in to comment.