@@ -285,7 +285,7 @@ inline int adjust_num_threads(int nthr, dim_t work_amount) {
285285#endif
286286}
287287
288- inline void parallel (int nthr, const std::function<void (int , int )> &f) {
288+ static inline void parallel (int nthr, const std::function<void (int , int )> &f) {
289289 nthr = adjust_num_threads (nthr, INT64_MAX);
290290#if DNNL_CPU_THREADING_RUNTIME == DNNL_RUNTIME_SEQ
291291 for (int i = 0 ; i < nthr; ++i) {
@@ -367,15 +367,22 @@ inline void parallel(int nthr, const std::function<void(int, int)> &f) {
367367#endif
368368}
369369
370+ // XXX: IMPORTANT!!!
371+ // Keep the functions below static.
372+ //
373+ // The threading file is included in gtests and benchdnn. When
374+ // the functions are not static it can cause a crash in gtests and
375+ // benchdnn on macOS with Intel 2021 compiler.
376+
370377/* for_nd section */
371- inline void for_nd (const int ithr, const int nthr, dim_t D0,
378+ static inline void for_nd (const int ithr, const int nthr, dim_t D0,
372379 const std::function<void (dim_t )> &f) {
373380 dim_t start {0 }, end {0 };
374381 balance211 (D0, nthr, ithr, start, end);
375382 for (dim_t d0 = start; d0 < end; ++d0)
376383 f (d0);
377384}
378- inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
385+ static inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
379386 const std::function<void (dim_t , dim_t )> &f) {
380387 const dim_t work_amount = D0 * D1;
381388 if (work_amount == 0 ) return ;
@@ -389,8 +396,8 @@ inline void for_nd(const int ithr, const int nthr, dim_t D0, dim_t D1,
389396 utils::nd_iterator_step (d0, D0, d1, D1);
390397 }
391398}
392- inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2 ,
393- const std::function<void (dim_t , dim_t , dim_t )> &f) {
399+ static inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
400+ dim_t D2, const std::function<void (dim_t , dim_t , dim_t )> &f) {
394401 const dim_t work_amount = D0 * D1 * D2;
395402 if (work_amount == 0 ) return ;
396403 dim_t start {0 }, end {0 };
@@ -403,8 +410,9 @@ inline void for_nd(const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2,
403410 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2);
404411 }
405412}
406- inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2,
407- dim_t D3, const std::function<void (dim_t , dim_t , dim_t , dim_t )> &f) {
413+ static inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
414+ dim_t D2, dim_t D3,
415+ const std::function<void (dim_t , dim_t , dim_t , dim_t )> &f) {
408416 const dim_t work_amount = D0 * D1 * D2 * D3;
409417 if (work_amount == 0 ) return ;
410418 dim_t start {0 }, end {0 };
@@ -417,8 +425,8 @@ inline void for_nd(const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2,
417425 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2, d3, D3);
418426 }
419427}
420- inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2 ,
421- dim_t D3, dim_t D4,
428+ static inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
429+ dim_t D2, dim_t D3, dim_t D4,
422430 const std::function<void (dim_t , dim_t , dim_t , dim_t , dim_t )> &f) {
423431 const dim_t work_amount = D0 * D1 * D2 * D3 * D4;
424432 if (work_amount == 0 ) return ;
@@ -432,8 +440,8 @@ inline void for_nd(const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2,
432440 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2, d3, D3, d4, D4);
433441 }
434442}
435- inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2 ,
436- dim_t D3, dim_t D4, dim_t D5,
443+ static inline void for_nd (const int ithr, const int nthr, dim_t D0, dim_t D1,
444+ dim_t D2, dim_t D3, dim_t D4, dim_t D5,
437445 const std::function<void (dim_t , dim_t , dim_t , dim_t , dim_t , dim_t )>
438446 &f) {
439447 const dim_t work_amount = D0 * D1 * D2 * D3 * D4 * D5;
@@ -451,15 +459,15 @@ inline void for_nd(const int ithr, const int nthr, dim_t D0, dim_t D1, dim_t D2,
451459}
452460
453461/* for_nd_ext section */
454- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
462+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
455463 const std::function<void (int , int , dim_t )> &f) {
456464 dim_t start {0 }, end {0 };
457465 balance211 (D0, nthr, ithr, start, end);
458466 for (dim_t d0 = start; d0 < end; ++d0)
459467 f (ithr, nthr, d0);
460468}
461- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0, dim_t D1 ,
462- const std::function<void (int , int , dim_t , dim_t )> &f) {
469+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
470+ dim_t D1, const std::function<void (int , int , dim_t , dim_t )> &f) {
463471 const dim_t work_amount = D0 * D1;
464472 if (work_amount == 0 ) return ;
465473 dim_t start {0 }, end {0 };
@@ -472,8 +480,9 @@ inline void for_nd_ext(const int ithr, const int nthr, dim_t D0, dim_t D1,
472480 utils::nd_iterator_step (d0, D0, d1, D1);
473481 }
474482}
475- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0, dim_t D1,
476- dim_t D2, const std::function<void (int , int , dim_t , dim_t , dim_t )> &f) {
483+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
484+ dim_t D1, dim_t D2,
485+ const std::function<void (int , int , dim_t , dim_t , dim_t )> &f) {
477486 const dim_t work_amount = D0 * D1 * D2;
478487 if (work_amount == 0 ) return ;
479488 dim_t start {0 }, end {0 };
@@ -486,8 +495,8 @@ inline void for_nd_ext(const int ithr, const int nthr, dim_t D0, dim_t D1,
486495 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2);
487496 }
488497}
489- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0, dim_t D1 ,
490- dim_t D2, dim_t D3,
498+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
499+ dim_t D1, dim_t D2, dim_t D3,
491500 const std::function<void (int , int , dim_t , dim_t , dim_t , dim_t )> &f) {
492501 const dim_t work_amount = D0 * D1 * D2 * D3;
493502 if (work_amount == 0 ) return ;
@@ -501,8 +510,8 @@ inline void for_nd_ext(const int ithr, const int nthr, dim_t D0, dim_t D1,
501510 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2, d3, D3);
502511 }
503512}
504- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0, dim_t D1 ,
505- dim_t D2, dim_t D3, dim_t D4,
513+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
514+ dim_t D1, dim_t D2, dim_t D3, dim_t D4,
506515 const std::function<void (int , int , dim_t , dim_t , dim_t , dim_t , dim_t )>
507516 &f) {
508517 const dim_t work_amount = D0 * D1 * D2 * D3 * D4;
@@ -517,8 +526,8 @@ inline void for_nd_ext(const int ithr, const int nthr, dim_t D0, dim_t D1,
517526 utils::nd_iterator_step (d0, D0, d1, D1, d2, D2, d3, D3, d4, D4);
518527 }
519528}
520- inline void for_nd_ext (const int ithr, const int nthr, dim_t D0, dim_t D1 ,
521- dim_t D2, dim_t D3, dim_t D4, dim_t D5,
529+ static inline void for_nd_ext (const int ithr, const int nthr, dim_t D0,
530+ dim_t D1, dim_t D2, dim_t D3, dim_t D4, dim_t D5,
522531 const std::function<void (
523532 int , int , dim_t , dim_t , dim_t , dim_t , dim_t , dim_t )> &f) {
524533 const dim_t work_amount = D0 * D1 * D2 * D3 * D4 * D5;
@@ -536,23 +545,23 @@ inline void for_nd_ext(const int ithr, const int nthr, dim_t D0, dim_t D1,
536545}
537546
538547/* parallel_nd_ext section */
539- inline void parallel_nd_ext (
548+ static inline void parallel_nd_ext (
540549 int nthr, dim_t D0, const std::function<void (int , int , dim_t )> &f) {
541550 const dim_t work_amount = D0;
542551 nthr = adjust_num_threads (nthr, work_amount);
543552 if (nthr)
544553 parallel (nthr,
545554 [&](int ithr, int nthr) { for_nd_ext (ithr, nthr, D0, f); });
546555}
547- inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1,
556+ static inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1,
548557 const std::function<void (int , int , dim_t , dim_t )> &f) {
549558 const dim_t work_amount = D0 * D1;
550559 nthr = adjust_num_threads (nthr, work_amount);
551560 if (nthr)
552561 parallel (nthr,
553562 [&](int ithr, int nthr) { for_nd_ext (ithr, nthr, D0, D1, f); });
554563}
555- inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2,
564+ static inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2,
556565 const std::function<void (int , int , dim_t , dim_t , dim_t )> &f) {
557566 const dim_t work_amount = D0 * D1 * D2;
558567 nthr = adjust_num_threads (nthr, work_amount);
@@ -561,7 +570,8 @@ inline void parallel_nd_ext(int nthr, dim_t D0, dim_t D1, dim_t D2,
561570 for_nd_ext (ithr, nthr, D0, D1, D2, f);
562571 });
563572}
564- inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3,
573+ static inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2,
574+ dim_t D3,
565575 const std::function<void (int , int , dim_t , dim_t , dim_t , dim_t )> &f) {
566576 const dim_t work_amount = D0 * D1 * D2 * D3;
567577 nthr = adjust_num_threads (nthr, work_amount);
@@ -570,8 +580,8 @@ inline void parallel_nd_ext(int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3,
570580 for_nd_ext (ithr, nthr, D0, D1, D2, D3, f);
571581 });
572582}
573- inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3 ,
574- dim_t D4,
583+ static inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2,
584+ dim_t D3, dim_t D4,
575585 const std::function<void (int , int , dim_t , dim_t , dim_t , dim_t , dim_t )>
576586 &f) {
577587 const dim_t work_amount = D0 * D1 * D2 * D3 * D4;
@@ -581,8 +591,8 @@ inline void parallel_nd_ext(int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3,
581591 for_nd_ext (ithr, nthr, D0, D1, D2, D3, D4, f);
582592 });
583593}
584- inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3 ,
585- dim_t D4, dim_t D5,
594+ static inline void parallel_nd_ext (int nthr, dim_t D0, dim_t D1, dim_t D2,
595+ dim_t D3, dim_t D4, dim_t D5,
586596 const std::function<void (
587597 int , int , dim_t , dim_t , dim_t , dim_t , dim_t , dim_t )> &f) {
588598 const dim_t work_amount = D0 * D1 * D2 * D3 * D4 * D5;
@@ -594,28 +604,28 @@ inline void parallel_nd_ext(int nthr, dim_t D0, dim_t D1, dim_t D2, dim_t D3,
594604}
595605
596606/* parallel_nd section */
597- inline void parallel_nd (dim_t D0, const std::function<void (dim_t )> &f) {
607+ static inline void parallel_nd (dim_t D0, const std::function<void (dim_t )> &f) {
598608 int nthr = adjust_num_threads (dnnl_get_current_num_threads (), D0);
599609 if (nthr)
600610 parallel (nthr, [&](int ithr, int nthr) { for_nd (ithr, nthr, D0, f); });
601611}
602- inline void parallel_nd (
612+ static inline void parallel_nd (
603613 dim_t D0, dim_t D1, const std::function<void (dim_t , dim_t )> &f) {
604614 const dim_t work_amount = D0 * D1;
605615 int nthr = adjust_num_threads (dnnl_get_current_num_threads (), work_amount);
606616 if (nthr)
607617 parallel (nthr,
608618 [&](int ithr, int nthr) { for_nd (ithr, nthr, D0, D1, f); });
609619}
610- inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2,
620+ static inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2,
611621 const std::function<void (dim_t , dim_t , dim_t )> &f) {
612622 const dim_t work_amount = D0 * D1 * D2;
613623 int nthr = adjust_num_threads (dnnl_get_current_num_threads (), work_amount);
614624 if (nthr)
615625 parallel (nthr,
616626 [&](int ithr, int nthr) { for_nd (ithr, nthr, D0, D1, D2, f); });
617627}
618- inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3,
628+ static inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3,
619629 const std::function<void (dim_t , dim_t , dim_t , dim_t )> &f) {
620630 const dim_t work_amount = D0 * D1 * D2 * D3;
621631 int nthr = adjust_num_threads (dnnl_get_current_num_threads (), work_amount);
@@ -624,7 +634,7 @@ inline void parallel_nd(dim_t D0, dim_t D1, dim_t D2, dim_t D3,
624634 for_nd (ithr, nthr, D0, D1, D2, D3, f);
625635 });
626636}
627- inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
637+ static inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
628638 const std::function<void (dim_t , dim_t , dim_t , dim_t , dim_t )> &f) {
629639 const dim_t work_amount = D0 * D1 * D2 * D3 * D4;
630640 int nthr = adjust_num_threads (dnnl_get_current_num_threads (), work_amount);
@@ -633,7 +643,7 @@ inline void parallel_nd(dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
633643 for_nd (ithr, nthr, D0, D1, D2, D3, D4, f);
634644 });
635645}
636- inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
646+ static inline void parallel_nd (dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
637647 dim_t D5,
638648 const std::function<void (dim_t , dim_t , dim_t , dim_t , dim_t , dim_t )>
639649 &f) {
@@ -644,6 +654,7 @@ inline void parallel_nd(dim_t D0, dim_t D1, dim_t D2, dim_t D3, dim_t D4,
644654 for_nd (ithr, nthr, D0, D1, D2, D3, D4, D5, f);
645655 });
646656}
657+
647658/* parallel_nd_in_omp section */
648659
649660template <typename ... Args>
0 commit comments