小编Ana*_*nas的帖子

如何将进程/线程优先级提高到 15 以上(高)

我有一个具有 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以上?

c++ winapi multithreading real-time thread-priority

5
推荐指数
1
解决办法
1629
查看次数

将原子变量传递给函数

我试图将原子变量传递给函数如下:

 // 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

谁知道如何解决这个问题?非常感谢您的帮助.

c++ atomic c++11

4
推荐指数
1
解决办法
4907
查看次数

OpenMP 线程未充分利用新机器上的 CPU 核心

我有一个多线程应用程序,可以并行解决巨大的矩阵。我最近更换了笔记本电脑,并开始在新笔记本电脑上出现一些奇怪的行为。旧笔记本电脑中的处理器是第 11 代英特尔(R) 酷睿(TM) i9-11950H,新笔记本电脑中的处理器是第 12 代英特尔(R) 酷睿(TM) i9-12900H。在旧笔记本电脑上运行我的多线程应用程序(使用 4 个线程)时,我看到这些线程占用了 4 个核心并充分利用它们,由于笔记本电脑有 8 个物理核心,总体 CPU 使用率约为 50%。请看下图: 在此输入图像描述

当使用相同(完全相同)的可执行二进制文件运行相同的应用程序时,我发现只有一个核心得到充分利用,其余核心的利用率约为 10%-20%,总体 CPU 使用率低于 15%。请看下图: 在此输入图像描述

有没有解释为什么相同的二进制文件在一台机器上运行而没有在另一台机器上运行?

笔记:

  • 我正在使用 OpenMP 启动线程
  • 我尝试将线程的优先级设置为高,但没有帮助

注意:在配备第 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 …

c++ multithreading fortran openmp

0
推荐指数
1
解决办法
946
查看次数