如何从 OpenMP 源代码向控制台打印内容?

How to print something to the console from OpenMP source Code?

我正在修改 OpenMP 源代码,我想确保它确实有效。 例如下面的代码:

#include "omp.h"

int main()
{
    int i=0;
    #pragma omp parallel for schedule(dynamic,4)
    for(i=0;i<1000;++i)
    {
        int x = 4+i;
    }
}

应该调用 __kmpc_dispatch_init_4() 我已经通过在 clang 中使用 emit-llvm 选项验证了这一点。

为了仔细检查,我添加了以下打印语句:

void __kmpc_dispatch_init_4(ident_t *loc, kmp_int32 gtid,
                            enum sched_type schedule, kmp_int32 lb,
                            kmp_int32 ub, kmp_int32 st, kmp_int32 chunk) {
  KMP_DEBUG_ASSERT(__kmp_init_serial);
  printf("%s\n", "Hello OpenMP");

#if OMPT_SUPPORT && OMPT_OPTIONAL
  OMPT_STORE_RETURN_ADDRESS(gtid);
#endif
  __kmp_dispatch_init<kmp_int32>(loc, gtid, schedule, lb, ub, st, chunk, true);
}

但是当我编译代码时,我没有在终端上得到这个输出。

我正在这样编译代码:

llvm_build/bin/clang sc.c  -L/usr/local/lib -fopenmp

构建 openmp 源代码后 sudo make install 的输出是这样的:

Install the project...
-- Install configuration: "Release"
-- Up-to-date: /usr/local/lib/libomp.so
-- Up-to-date: /usr/local/include/omp.h
-- Up-to-date: /usr/local/include/omp-tools.h
-- Up-to-date: /usr/local/include/ompt.h
-- Up-to-date: /usr/local/lib/libomptarget.so
-- Up-to-date: /usr/local/lib/libomptarget.rtl.x86_64.so

为了交叉检查是否使用了我使用的:

ldd a.out

输出为:

linux-vdso.so.1 (0x00007fff25bb6000)
    libomp.so => /usr/local/lib/libomp.so (0x00007f75a52c6000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f75a50a7000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75a4cb6000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f75a4ab2000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f75a558a000)

所以我假设它应该使用我修改过的代码。 但是看不到打印语句的输出。 我也尝试过使用 fprintf(stderr, ....) 但是没用。

提前谢谢你。

首先,您应该在 printf 之后使用 fflush(stdout) 刷新输出,以强制在控制台中打印该行。 此外,您还应该通过检查文件的修改日期(使用 stat 命令)来确保 /usr/local/lib/libomp.so 是正确的。 如果加载的文件不是正确的文件,您可以使用 LD_LIBRARY_PATHLIBRARY_PATHLD_PRELOAD 环境变量强制加载。 如果这还不够,您可以使用 nmobjdump 工具来检查 dynamic 符号:该函数应该在您的程序中未定义并由修改了 LLVM OpenMP 运行时。

PS:如果 none 有效,我强烈建议您使用调试(和跟踪)信息构建您的程序和 OpenMP 运行时库,以便您可以使用像 [=19 这样的调试器=] 以便跟踪函数调用。