相关疑难解决方法(0)

线程上下文切换Vs. 进程上下文切换

谁能告诉我在这两种情况下究竟做了什么?每个人的主要成本是多少?

multithreading process context-switch

112
推荐指数
3
解决办法
8万
查看次数

编写一个C程序来测量Linux OS中上下文切换所花费的时间

我们可以编写ac程序来找出在Linux中进行上下文切换所花费的时间吗?如果你有代码,请你分享代码吗?谢谢

c linux context-switch

27
推荐指数
4
解决办法
3万
查看次数

Linux是否为TLB使用x86 CPU的PCID功能?如果没有,为什么?

我写了一个内核模块来检查CR4.PCIDE,它没有设置.为什么Linux不使用这样的功能来减少因TLB失效和缓存污染导致的性能下降?

x86 assembly caching operating-system linux-kernel

26
推荐指数
2
解决办法
9138
查看次数

为什么完全CPU绑定的进程在超线程中更好用?

鉴于:

  • 一个完全CPU绑定非常大(即多个CPU周期)的工作,和
  • 一个具有4个物理和8个逻辑核心的CPU,

8,16和28个线程可能比4个线程表现更好吗?我的理解是,4个线程将执行较少的上下文切换,并且在任何意义上将比4个物理核心机器上的8,16或28个线程具有更少的开销.但是,时间是 -

Threads    Time Taken (in seconds)
   4         78.82
   8         48.58
   16        51.35
   28        52.10
Run Code Online (Sandbox Code Playgroud)

用于测试获取时间的代码在下面的原始问题部分中提到.CPU规格也在底部给出.


在阅读了各个用户提供的答案以及评论中给出的信息后,我终于可以将问题归结为我上面写的内容.如果上述问题为您提供完整的上下文,则可以跳过下面的原始问题.

原始问题

我们说的是什么意思

超线程的工作方式是复制处理器的某些部分 - 存储体系结构状态的部分 - 但不复制主要执行资源.这允许超线程处理器作为通常的"物理"处理器和主机操作系统的额外"逻辑"处理器出现

?

今天在SO上询问了这个问题,它基本上测试了多个线程执行相同工作的性能.它具有以下代码:

private static void Main(string[] args)
{
    int threadCount;
    if (args == null || args.Length < 1 || !int.TryParse(args[0], out threadCount))
        threadCount = Environment.ProcessorCount;

    int load;
    if (args == null || args.Length < 2 || !int.TryParse(args[1], out load))
        load = 1;

    Console.WriteLine("ThreadCount:{0} Load:{1}", …
Run Code Online (Sandbox Code Playgroud)

.net c# performance multithreading hyperthreading

23
推荐指数
2
解决办法
2105
查看次数

Python 3多处理:最佳块大小

如何找到multiprocessing.Pool实例的最佳块大小?

之前我用过这个来创建一个nsudoku对象的生成器:

processes = multiprocessing.cpu_count()
worker_pool = multiprocessing.Pool(processes)
sudokus = worker_pool.imap_unordered(create_sudoku, range(n), n // processes + 1)
Run Code Online (Sandbox Code Playgroud)

为了测量时间,我time.time()在上面的片段之前使用,然后按照描述初始化池,然后我将生成器转换为list(list(sudokus))以触发生成项目(仅用于时间测量,我知道这在最终程序中是无意义的),然后我time.time()再次使用时间并输出差异.

我观察到每个对象的块大小n // processes + 1约为0.425毫秒.但我也观察到CPU只在整个过程的前半部分完全加载,最终使用率下降到25%(在具有2核和超线程的i3上).

如果我使用较小的块大小int(l // (processes**2) + 1),我会得到大约0.355毫秒的时间,并且CPU负载分布更好.它只有一些小的尖峰到ca. 75%,但在处理时间的长时间内保持高位,然后降至25%.

是否有更好的公式来计算块大小或更好的方法来使用CPU最有效?请帮助我提高这个多处理池的有效性.

performance multiprocessing python-3.x python-multiprocessing

7
推荐指数
1
解决办法
3766
查看次数

上下文切换在Linux中需要多长时间?

我很好奇在Linux中更改上下文需要多少周期.我特意使用E5405 Xeon(x64),但我也很想看看它与其他平台的对比情况.

linux performance multithreading low-level

3
推荐指数
1
解决办法
5464
查看次数