Как напечатать что-нибудь на консоль из исходного кода OpenMP? - PullRequest
0 голосов
/ 19 марта 2020

Я изменяю исходный код 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 (). И я проверил это, используя опцию emit-llvm в clang.

Для двойной проверки я добавил следующий оператор печати:

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, ....), но не работает.

Заранее спасибо.

1 Ответ

1 голос
/ 19 марта 2020

Во-первых, вы должны выполнить sh вывод, используя fflush(stdout) после printf, чтобы принудительно вывести строку на консоль. Кроме того, вы также должны убедиться, что /usr/local/lib/libomp.so является хорошим, просто проверив дату изменения файла (с помощью команды stat). Если загруженный файл не является хорошим, вы можете принудительно установить его с помощью переменных окружения LD_LIBRARY_PATH, LIBRARY_PATH и LD_PRELOAD. Если этого недостаточно, вы можете использовать инструменты nm или objdump для проверки символов dynamici c: функция должна быть неопределена в вашей программе и предоставлена ​​измененной средой выполнения LLVM OpenMP.

PS: Если ничего из этого не работает, я настоятельно советую вам собрать свою программу и библиотеку времени выполнения OpenMP с информацией об отладке (и трассировке), чтобы вы могли использовать отладчики, такие как gdb, для отслеживания вызовов функций.

...