在C中使用schedule(static)
并行化循环意味着块大小可以快速计算为 ceil
(loops/threads)
。
对于我的项目,我必须通过9种不同的块大小来实现,其中一种是“默认”。我就这样做了:
我编写了一个perl循环,用-DCHUNKSIZE=$c
编译我的程序,并在omp
代码中指定schedule(static, CHUNKSIZE)
。
问题:默认情况下我该怎么办?块大小为0不起作用:(
谢谢!
P.S。
我希望避免使用#ifdef ... #else ... #endif
,因为我有很多并行化的循环
答案 0 :(得分:2)
我同意ejd。至于如何处理它,为什么不:
#ifdef CHUNKSIZE
#pragma omp parallel for schedule(mode, CHUNKSIZE)
#else
#pragma omp parallel for schedule(mode)
#endif
for ( ; ; ) /* ... */
然后不会传递-DCHUNKSIZE
作为默认值。
答案 1 :(得分:1)
你必须完全关闭chunksize并指定“schedule(kind)”。
答案 2 :(得分:1)
#ifdef CHUNKSIZE
#define OPM_FOR(mode) _Pragma("omp parallel for schedule(" #mode ", "CHUNKSIZE")")
#else
#define OMP_FOR(mode) _Pragma("omp parallel for schedule(" #mode ")")
#endif
OMP_FOR(static)
for ( ; ; ) { /* */ }
基本上,Æsahættr的解决方案是额外使用_Pragma()运算符(我相信在C99中)。