如何判断 OpenMP 是不是正常工作?
Posted
技术标签:
【中文标题】如何判断 OpenMP 是不是正常工作?【英文标题】:How to tell if OpenMP is working?如何判断 OpenMP 是否正常工作? 【发布时间】:2012-05-15 22:24:45 【问题描述】:我正在尝试以并行模式运行 LIBSVM,但我的问题一般是在 OpenMP 中。根据LIBSVM FAQ,我使用#pragma 调用修改了代码以使用OpenMP。我还通过添加 -fopenmp 参数修改了 Makefile(对于 un*x),使其变为:
CFLAGS = -Wall -Wconversion -O3 -fPIC -fopenmp
代码编译良好。我检查(因为它不是我的 PC)是否安装了 OpenMP:
/sbin/ldconfig -p | grep gomp
并看到它 - 可能 - 已安装:
libgomp.so.1 (libc6,x86-64) => /usr/lib64/libgomp.so.1
libgomp.so.1 (libc6) => /usr/lib/libgomp.so.1
现在;当我运行程序时,我没有看到任何速度改进。此外,当我使用“top”检查时,进程最多使用 %100 CPU(有 8 个内核),也没有 CPU 瓶颈(只有一个用户使用 %100 CPU),我希望看到更多%100(或不同的指标)该进程正在使用多个内核。
有没有办法检查它是否在多核工作?
【问题讨论】:
只是一个想法,但不应该是最大值。当只有一个线程在运行时,100%/核心数? 不,当使用多核时(至少在我的服务器安装中),我们看到的值远大于 100% @Tibor,top 默认为 Irix 模式,显示单个 CPU 的满负载为 100%,n 个 CPU 的满负载为 n*100%。如果您关闭 Irix 模式(按“I”),则在使用所有 CPU 时显示 100%。 【参考方案1】:您可以使用函数omp_get_num_threads()
。它将返回您的程序使用的线程数。
【讨论】:
必须在并行区域内调用omp_get_num_threads()
。否则它总是返回 1!【参考方案2】:
使用omp_get_max_threads()
,您可以获得程序可用的最大线程数。它也是omp_get_num_threads()
的所有可能返回值中的最大值。您可以使用环境变量OMP_NUM_THREADS
显式设置程序要使用的线程数,例如在 bash 中通过
$export OMP_NUM_THREADS=8; your_program
【讨论】:
以上是关于如何判断 OpenMP 是不是正常工作?的主要内容,如果未能解决你的问题,请参考以下文章