我有一个具有 8 个物理核心(16 个具有超线程)的 Intel 处理器,我试图通过提高 C++ 应用程序进程的优先级以及我在此应用程序中启动的四个线程的优先级来充分利用其中四个核心(我正在使用 OpenMp 来午餐线程)。
根据微软的优先级表:
进程优先级 | 线程优先级 | 基本优先级 |
---|---|---|
HIGH_PRIORITY_CLASS | 线程优先级空闲 | 1 |
THREAD_PRIORITY_LOWEST | 11 | |
THREAD_PRIORITY_BELOW_NORMAL | 12 | |
线程优先级正常 | 13 | |
THREAD_PRIORITY_ABOVE_NORMAL | 14 | |
THREAD_PRIORITY_HIGHEST | 15 | |
THREAD_PRIORITY_TIME_CRITICAL | 15 | |
REALTIME_PRIORITY_CLASS | 线程优先级空闲 | 16 |
THREAD_PRIORITY_LOWEST | 22 | |
THREAD_PRIORITY_BELOW_NORMAL | 23 | |
线程优先级正常 | 24 | |
THREAD_PRIORITY_ABOVE_NORMAL | 25 | |
THREAD_PRIORITY_HIGHEST | 26 | |
THREAD_PRIORITY_TIME_CRITICAL | 31 |
当我执行以下操作时,我只看到优先级设置为 15:
int priority;
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
priority = GetThreadPriority(GetCurrentThread());
Run Code Online (Sandbox Code Playgroud)
另外,从任务管理器检查优先级,它设置为高,而不是实时的。
如何将优先级提高到15以上?
我试图将原子变量传递给函数如下:
// function factor receives an atomic variable
void factor(std::atomic<int> ThreadsCounter)
{
.........
}
// main starts here
int main()
{
// Atomic variable declaration
std::atomic<int> ThreadsCounter(0);
// passing atomic variable to the function factor through a thread
Threadlist[0] = std::thread (factor, std::ref(ThreadsCounter));
Threadlist[0].join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行上面的代码时,我收到以下错误:
错误2错误C2280:'std :: atomic :: atomic(const std :: atomic&)':尝试引用已删除的函数c:\ program files(x86)\ microsoft visual studio 12.0\vc\include\functional 1149 1 klu_factor
谁知道如何解决这个问题?非常感谢您的帮助.
我有一个多线程应用程序,可以并行解决巨大的矩阵。我最近更换了笔记本电脑,并开始在新笔记本电脑上出现一些奇怪的行为。旧笔记本电脑中的处理器是第 11 代英特尔(R) 酷睿(TM) i9-11950H,新笔记本电脑中的处理器是第 12 代英特尔(R) 酷睿(TM) i9-12900H。在旧笔记本电脑上运行我的多线程应用程序(使用 4 个线程)时,我看到这些线程占用了 4 个核心并充分利用它们,由于笔记本电脑有 8 个物理核心,总体 CPU 使用率约为 50%。请看下图:
当使用相同(完全相同)的可执行二进制文件运行相同的应用程序时,我发现只有一个核心得到充分利用,其余核心的利用率约为 10%-20%,总体 CPU 使用率低于 15%。请看下图:
有没有解释为什么相同的二进制文件在一台机器上运行而没有在另一台机器上运行?
笔记:
注意:在配备第 12 代英特尔(R) 酷睿(TM) i9-12900H 的笔记本电脑上,我从 BIOS 禁用了 E 核心,以确保线程仅分配给 P 核心,但这并没有解决问题。请看下面:
从上图中我们可以看到,只有线程1充分利用了它的CPU。
以下是我启动线程的方式:
CALL OMP_SET_NUM_THREADS(4)
!$OMP PARALLEL DO PRIVATE(i)
DO i = 1, 4, 1
CALL solve_axb_r_submat(n, A, line_A, X, B, flag, i, submatrix_number, Fkluunit(i))
END DO
!$OMP END PARALLEL DO
Run Code Online (Sandbox Code Playgroud)
上面的代码被调用超过 20000 次,因此每次迭代都会调用一个具有上面代码段的函数。我正在使用 Visual studio …