小编nh2*_*nh2的帖子

为什么Linux的调度程序将两个线程放在具有超线程的处理器上的同一物理内核上?

我已经在多个地方读过Linux的默认调度程序在多核机器上的超线程感知,这意味着如果你有一台具有2个真实内核(4 HT)的机器,它将不会以某种方式将两个忙线程安排到逻辑内核上它们都运行在相同的物理内核上(在许多情况下会导致2倍的性能成本).

但是当我stress -c 2在我的Intel i5-2520M上运行(产生两个线程以在100%CPU上运行)时,它经常将两个线程调度(并保持)到HT核心1和2上,这些核心映射到相同的物理核心.即使系统处于空闲状态.

这也适用于真正的程序(我在stress这里使用它因为它很容易重现),当发生这种情况时,我的程序可以理解地需要两倍的时间来运行.手动设置亲和力与taskset我的程序的修复程序,但我希望HT感知调度程序自己正确地执行此操作.

您可以找到HT->物理核心配置egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'.

所以我的问题是:为什么调度程序将我的线程放在同一个物理内核上?


笔记:

  • 这个问题与其他问题非常相似,答案就是说Linux有一个非常复杂的线程调度程序,它具有HT意识.如上所述,我无法观察到这一事实(请自行检查stress -c),并想知道原因.
  • 我知道我可以手动为我的程序设置处理器亲和性,例如使用taskset工具或sched_setaffinity函数.这不是我正在寻找的,我希望调度程序能够自己知道将两个忙线程映射到物理核心并将一个物理核心完全留空并不是一个好主意.
  • 我知道在某些情况下你更喜欢将线程安排到同一个物理内核上并让其他内核保持空闲,但调度程序大约1/4的情况下,这似乎是荒谬的.在我看来,它所选择的HT核心是完全随机的,或者可能是那些在调度时活动最少的HT核心,但这并不是非常超线程的意识,考虑到具有stress受益于在不同的物理核心上运行.

linux performance multithreading scheduler

18
推荐指数
2
解决办法
5071
查看次数

配置Haskell而不安装所有依赖项的安装配置文件库

我希望介绍用Haskell编写的程序.

在编译时,我被告知我没有为某些依赖项(例如criterion)安装和cabal中止分析库.

我没有兴趣分析这些依赖项的部分内容; 调用的代码main甚至不使用它们.

如何在不安装我不需要的分析库的情况下分析我的应用程序,并且不删除所有这些依赖项?

profiling haskell

16
推荐指数
3
解决办法
3267
查看次数

使用GHC最大化Haskell循环性能

为了比较性能与GHC bug中缓慢的列表, 我试图尽可能快地得到以下循环:

{-# LANGUAGE BangPatterns #-}

module Main (main) where

import Control.Monad
import Data.Word


main :: IO ()
main = do
  loop (maxBound :: Word32) $ \i -> do
    when (i `rem` 100000000 == 0) $
      print (fromIntegral i / fromIntegral (maxBound :: Word32))


loop :: Word32 -> (Word32 -> IO ()) -> IO ()
loop n f = go 0
  where
    go !i | i == n = return ()
    go !i          = f i >> …
Run Code Online (Sandbox Code Playgroud)

performance haskell ghc

15
推荐指数
1
解决办法
688
查看次数

如何在Haskell中将日期/时间格式化为ISO 8601

我想将完整的日期/时间转换为像ISO 一样的new Date().toISOString() ISO 8601格式,给出一种YYYY-MM-DDTHH:mm:ss.sssZ格式.

我找不到基本库函数或包来执行此操作.

datetime haskell iso8601

14
推荐指数
2
解决办法
2008
查看次数

快速检查:如何使用穷举检查器来防止总和类型的被遗忘的构造函数

我有一个Haskell数据类型

data Mytype
  = C1
  | C2 Char
  | C3 Int String
Run Code Online (Sandbox Code Playgroud)

如果我case在a Mytype并忘记处理其中一个案例,GHC会给我一个警告(详尽检查).

我现在想编写一个QuickCheck Arbitrary实例来生成MyTypes如下:

instance Arbitrary Mytype where
  arbitrary = do
    n <- choose (1, 3 :: Int)
    case n of
      1 -> C1
      2 -> C2 <$> arbitrary
      3 -> C3 <$> arbitrary <*> someCustomGen
Run Code Online (Sandbox Code Playgroud)

这个问题是我可以添加一个新的替代方案Mytype并忘记更新Arbitrary实例,因此让我的测试不测试该替代方案.

我想找到一种方法来使用GHC的详尽检查器来提醒我在我的任意实例中被遗忘的案例.

我想出的最好的是

arbitrary = do
  x <- elements [C1, C2 undefined, C3 undefined undefined]
  case x of
    C1     -> C1
    C2 …
Run Code Online (Sandbox Code Playgroud)

haskell quickcheck

14
推荐指数
1
解决办法
303
查看次数

打印Python和C++时的精度差异加倍

我现在惊叹于此:

C++ 11

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
  double d = 1.305195828773568;
  std::cout << std::setprecision(std::numeric_limits<double>::max_digits10) << d << std::endl;
  // Prints  1.3051958287735681
}
Run Code Online (Sandbox Code Playgroud)

蟒蛇

>>> repr(1.305195828773568)
'1.305195828773568'
Run Code Online (Sandbox Code Playgroud)

发生了什么,为什么C++中的额外1?

到目前为止,我认为C++和Python使用相同的64位IEEE双打; 两个格式化函数都应该打印完整的精度.

c++ python floating-point double

14
推荐指数
2
解决办法
1455
查看次数

如何使用cabal构建重新编译Haskell,仅显示警告

cabal build我的项目,警告(尤其是-Wall)仅在第一次显示.

在后续构建中,所有内容都被缓存.

我想再次看到我项目的所有警告.

我可以cabal clean重新编译或使用cabal build --ghc-options="-fforce-recomp",但只是时间太长.

如何尽快进行警告检查?

haskell cabal

13
推荐指数
1
解决办法
1361
查看次数

如何转换ByteString和Storable Vector?

什么是转换Storable.Vector Word8和严格的最佳方式ByteString

当然,非常感谢非复制(无操作)方式.

我应该只是unsafeCoerce或者是否有一个库函数(我找不到)?

此外,方法是否相同Unboxed.Vector Word8

haskell

13
推荐指数
2
解决办法
1244
查看次数

如何禁用GHC Haskell中的垃圾收集?

如何禁用GC,或大大降低GC的频率?

就像给它+RTS一些巨大的堆或分配大小的选项可能?

我希望看到我的程序在没有GC发生时的行为.

haskell ghc

13
推荐指数
1
解决办法
871
查看次数

使用GADT进行类型推断 - a0是不可触及的

可以说我有这个程序

{-# LANGUAGE GADTs #-}

data My a where
  A :: Int  -> My Int
  B :: Char -> My Char


main :: IO ()
main = do
  let x = undefined :: My a

  case x of
    A v -> print v

  -- print x
Run Code Online (Sandbox Code Playgroud)

编译好.

但当我评论时print x,我得到:

gadt.hs: line 13, column 12:
  Couldn't match type ‘a0’ with ‘()’
    ‘a0’ is untouchable
      inside the constraints (a1 ~ GHC.Types.Int)
      bound by a pattern with constructor
                 Main.A :: GHC.Types.Int …
Run Code Online (Sandbox Code Playgroud)

haskell gadt

12
推荐指数
1
解决办法
631
查看次数