如何从 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_PATH
、LIBRARY_PATH
和 LD_PRELOAD
环境变量强制加载。
如果这还不够,您可以使用 nm
或 objdump
工具来检查 dynamic 符号:该函数应该在您的程序中未定义并由修改了 LLVM OpenMP 运行时。
PS:如果 none 有效,我强烈建议您使用调试(和跟踪)信息构建您的程序和 OpenMP 运行时库,以便您可以使用像 [=19 这样的调试器=] 以便跟踪函数调用。
我正在修改 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_PATH
、LIBRARY_PATH
和 LD_PRELOAD
环境变量强制加载。
如果这还不够,您可以使用 nm
或 objdump
工具来检查 dynamic 符号:该函数应该在您的程序中未定义并由修改了 LLVM OpenMP 运行时。
PS:如果 none 有效,我强烈建议您使用调试(和跟踪)信息构建您的程序和 OpenMP 运行时库,以便您可以使用像 [=19 这样的调试器=] 以便跟踪函数调用。