affinity-2.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* { dg-do run } */
  2. /* { dg-set-target-env-var OMP_PROC_BIND "spread,close" } */
  3. /* { dg-set-target-env-var OMP_PLACES "{6,7}:4:-2,!{2,3}" } */
  4. /* { dg-set-target-env-var OMP_NUM_THREADS "2" } */
  5. /* { dg-additional-options "-Wno-deprecated-declarations" } */
  6. #include <omp.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. int *
  10. get_buf (int nump)
  11. {
  12. static int *buf;
  13. static size_t buf_size;
  14. if ((size_t) nump > buf_size)
  15. {
  16. buf_size *= 2;
  17. if (nump > buf_size)
  18. buf_size = nump + 64;
  19. int *bufn = realloc (buf, buf_size * sizeof (int));
  20. if (bufn == NULL)
  21. {
  22. fprintf (stderr, "memory allocation error\n");
  23. exit (1);
  24. }
  25. buf = bufn;
  26. }
  27. return buf;
  28. }
  29. void
  30. print_place (int count, int *ids)
  31. {
  32. int i, j;
  33. printf ("{");
  34. for (i = 0; i < count; i++)
  35. {
  36. for (j = i + 1; j < count; j++)
  37. if (ids[j] != ids[i] + (j - i))
  38. break;
  39. if (i)
  40. printf (",");
  41. if (j == i + 1)
  42. printf ("%d", ids[i]);
  43. else
  44. {
  45. printf ("%d:%d", ids[i], j - i);
  46. i = j - 1;
  47. }
  48. }
  49. printf ("}\n");
  50. }
  51. void
  52. print_place_var (void)
  53. {
  54. int place = omp_get_place_num ();
  55. int num_places = omp_get_partition_num_places ();
  56. int *ids = get_buf (num_places);
  57. omp_get_partition_place_nums (ids);
  58. printf ("place %d\n", place);
  59. if (num_places)
  60. printf ("partition %d-%d\n", ids[0], ids[num_places - 1]);
  61. }
  62. int
  63. main ()
  64. {
  65. int i, num = omp_get_num_places (), nump, *ids;
  66. printf ("omp_get_num_places () == %d\n", num);
  67. for (i = 0; i < num; i++)
  68. {
  69. printf ("place %d ", i);
  70. nump = omp_get_place_num_procs (i);
  71. ids = get_buf (nump);
  72. omp_get_place_proc_ids (i, ids);
  73. print_place (nump, ids);
  74. }
  75. print_place_var ();
  76. omp_set_nested (1);
  77. #pragma omp parallel
  78. if (omp_get_thread_num () == omp_get_num_threads () - 1)
  79. {
  80. #pragma omp parallel
  81. if (omp_get_thread_num () == omp_get_num_threads () - 1)
  82. print_place_var ();
  83. }
  84. return 0;
  85. }