[Openmp-dev] Is omp construct valid in a simd routine.

Narayanaswamy, Ravi via Openmp-dev openmp-dev at lists.llvm.org
Mon Nov 16 10:57:28 PST 2020

Is this example valid

int counter;

#pragma omp declare simd simdlen(16)

void __attribute__((noinline)) foo(bool isSIMD){

  if (!isSIMD) {

    #pragma omp parallel num_threads(1)

      printf("%d\n", counter);

  } else {

    printf("%d\n", counter);



void bar() {

  foo(false); // Is the user wrong to expect this call to foo honor "#pragma omp parallel" in foo?


void baz() {

  #pragma omp simd

  for(int i = 0; i < 32; i++)

    foo(true); // Is it the compiler's responsibility to ignore the "#pragma omp parallel" inside foo() for this call?


The spec says

The execution of the function or subroutine, when called from a SIMD loop, cannot result in the

execution of an OpenMP construct except for an ordered construct with the simd clause or an

atomic construct.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-dev/attachments/20201116/ba149dac/attachment.html>

More information about the Openmp-dev mailing list