brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · c180271 Raw
118 lines · c
1// RUN: %libomp-compile-and-run2 3#include <stdio.h>4#include <stdlib.h>5#include <string.h>6#include <omp.h>7 8#define XSTR(x) #x9#define STR(x) XSTR(x)10 11#define streqls(s1, s2) (!strcmp(s1, s2))12 13#define check(condition)                                                       \14  if (!(condition)) {                                                          \15    fprintf(stderr, "error: %s: %d: " STR(condition) "\n", __FILE__,           \16            __LINE__);                                                         \17    exit(1);                                                                   \18  }19 20#define BUFFER_SIZE 102421 22char buf[BUFFER_SIZE];23#pragma omp threadprivate(buf)24 25char* get_string(size_t check_needed) {26  size_t needed = omp_capture_affinity(buf, BUFFER_SIZE, NULL);27  //printf("buf = %s\n", buf);28  check(needed < BUFFER_SIZE);29  if (check_needed != 0) {30    check(needed == check_needed);31  }32  return buf;33}34 35void check_thread_num_padded_rjustified() {36  int i;37  const char* formats[2] = {"%0.8{thread_num}", "%0.8n"};38  for (i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) {39    omp_set_affinity_format(formats[i]);40    #pragma omp parallel num_threads(8)41    {42      int j;43      int tid = omp_get_thread_num();44      char ctid = '0' + (char)tid;45      char* s = get_string(8);46      for (j = 0; j < 7; ++j) {47        check(s[j] == '0');48      }49      check(s[j] == ctid);50    }51  }52}53 54void check_thread_num_rjustified() {55  int i;56  const char* formats[2] = {"%.12{thread_num}", "%.12n"};57  for (i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) {58    omp_set_affinity_format(formats[i]);59    #pragma omp parallel num_threads(8)60    {61      int j;62      int tid = omp_get_thread_num();63      char ctid = '0' + (char)tid;64      char* s = get_string(12);65      for (j = 0; j < 11; ++j) {66        check(s[j] == ' ');67      }68      check(s[j] == ctid);69    }70  }71}72 73void check_thread_num_ljustified() {74  int i;75  const char* formats[2] = {"%5{thread_num}", "%5n"};76  for (i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) {77    omp_set_affinity_format(formats[i]);78    #pragma omp parallel num_threads(8)79    {80      int j;81      int tid = omp_get_thread_num();82      char ctid = '0' + (char)tid;83      char* s = get_string(5);84      check(s[0] == ctid);85      for (j = 1; j < 5; ++j) {86        check(s[j] == ' ');87      }88    }89  }90}91 92void check_thread_num_padded_ljustified() {93  int i;94  const char* formats[2] = {"%018{thread_num}", "%018n"};95  for (i = 0; i < sizeof(formats)/sizeof(formats[0]); ++i) {96    omp_set_affinity_format(formats[i]);97    #pragma omp parallel num_threads(8)98    {99      int j;100      int tid = omp_get_thread_num();101      char ctid = '0' + (char)tid;102      char* s = get_string(18);103      check(s[0] == ctid);104      for (j = 1; j < 18; ++j) {105        check(s[j] == ' ');106      }107    }108  }109}110 111int main(int argc, char** argv) {112  check_thread_num_ljustified();113  check_thread_num_rjustified();114  check_thread_num_padded_ljustified();115  check_thread_num_padded_rjustified();116  return 0;117}118