小编bar*_*hen的帖子

无滴答内核,isolcpus,nohz_full和rcu_nocbs

我在RedHat 7.1中的grub.conf中添加了"isolcpus = 3 nohz_full = 3 rcu_nocbs = 3",内核:linux 3.10.0-229内核并且根据http://www.breakage.org/2013/11/15/ nohz_fullgodmode / 我还执行以下命令:

cat /sys/bus/workqueue/devices/writeback/cpumask
f
echo 1 > /sys/bus/workqueue/devices/writeback/cpumask

cat /sys/bus/workqueue/devices/writeback/numa
1
echo 0 > /sys/bus/workqueue/devices/writeback/numa
Run Code Online (Sandbox Code Playgroud)

该盒子只有4个cpu核心,我运行以下shell:

watch -d 'cat /proc/interrupts'
Run Code Online (Sandbox Code Playgroud)

看起来工作完美,只有cpu0本地定时器中断每2秒2000,其他cpu 1到cpu 3每2秒少于10.

然后我测试以下来源:

void *Thread2(void *param)
{
    pthread_detach(pthread_self());
    while( 1 ){
        sleep( 100000 ) ;
    }
}

void *Thread1(void *param)
{
    pthread_detach(pthread_self());
    while( 1 ){
        ;
    }
}

int main(int argc, char** argv)
{
    pthread_t tid ;
    pthread_create(&tid , NULL, Thread1, (void*)(long)3);
    pthread_create(&tid , NULL, …
Run Code Online (Sandbox Code Playgroud)

linux interrupt linux-kernel

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

linux中的sched_setaffinity cpu affinity

我在Linux中在一个带有1个套接字,4个内核的服务器上做了一个sched_setaffinity测试,下面的/ proc/cpuinfo显示了cpu信息:

processor       : 0
model name      : Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
cache size      : 2048 KB
physical id     : 0
siblings        : 4
cpu cores       : 4

processor       : 1
model name      : Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
cache size      : 2048 KB
physical id     : 0
siblings        : 4
cpu cores       : 4

processor       : 2
model name      : Intel(R) Core(TM)2 Quad CPU    Q8400  @ 2.66GHz
cache size      : 2048 KB
physical id …
Run Code Online (Sandbox Code Playgroud)

c linux cpu

6
推荐指数
1
解决办法
7437
查看次数

gnu ++ 11和c ++ 0x中的unordered_multimap不同行为

我有以下程序在不同的编译器编译,并得到不同的行为,

资源 :

#include <iostream>
#include <sstream>
#include <unordered_map>

using namespace std ;

std::unordered_map<std::string,std::string> mymap;
std::unordered_multimap<std::string,std::string> mymultimap;
int main ()
{
    DoAddItem() ;

    std::cout << "mymap contains:";
    for ( auto it = mymap.begin(); it != mymap.end(); ++it )
        std::cout << " " << it->first << ":" << it->second;
    std::cout << std::endl;

    std::cout << "============================================" << std::endl ;
    std::cout << "mymultimap contains:";
    for ( auto it2 = mymultimap.begin(); it2 != mymultimap.end(); ++it2 )
        std::cout << " " << it2->first << ":" …
Run Code Online (Sandbox Code Playgroud)

c++ gcc mingw c++11

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

如何解释perf iTLB负载,iTLB-load-miss

我有一个测试用例来观察iTLB负载,iTLB负载未命中

perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses -p 22479
Run Code Online (Sandbox Code Playgroud)

并得到输出:

进程ID"22479"的性能计数器统计信息:

     1,262,817      dTLB-loads                                                  
        13,950      dTLB-load-misses          #    1.10% of all dTLB cache hits 
            75      iTLB-loads                                                  
         6,882      iTLB-load-misses          # 9176.00% of all iTLB cache hits 

   3.999720948 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)

我不知道如何解释iTLB负载仅75但iTLB负载未命中6,882?

lscpu showes:Intel(R)Xeon(R)CPU E5-2620 v4 @ 2.10GHz

编辑:

我可以解释如下:

做(75 + 6882)次iTLB负载,有75次点击但6882次未命中?

编辑:

ocperf.py list | wc -l
Downloading https://download.01.org/perfmon/mapfile.csv to mapfile.csv

Traceback (most recent call last):
File "/home/marschen/tools/pmu-tools-master/ocperf.py", line 1012, in <module>
emap = find_emap()
File "/home/marschen/tools/pmu-tools-master/ocperf.py", line 831, in find_emap
event_download.download(el, toget)
File …
Run Code Online (Sandbox Code Playgroud)

x86 intel cpu-architecture tlb perf

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

epoll与边缘触发事件

epoll的手册页有一个边缘触发示例代码,如下所示:

for (;;) {
    nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
    if (nfds == -1) {
        perror("epoll_pwait");
        exit(EXIT_FAILURE);
    }

    for (n = 0; n < nfds; ++n) {
        if (events[n].data.fd == listen_sock) {
            conn_sock = accept(listen_sock,
                        (struct sockaddr *) &local, &addrlen);
            if (conn_sock == -1) {
                perror("accept");
                exit(EXIT_FAILURE);
            }
            setnonblocking(conn_sock);
            ev.events = EPOLLIN | EPOLLET;
            ev.data.fd = conn_sock;
            if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
                    &ev) == -1) {
                perror("epoll_ctl: conn_sock");
                exit(EXIT_FAILURE);
            }
        } else {
            do_use_fd(events[n].data.fd);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在函数do_use_fd中,我在while循环中调用非阻塞的recv直到EAGAIN,示例代码工作正常.

我对这个示例代码有疑问,假设现在我有50个套接字客户端连接,突然有10个客户端同时写入数据,所以epoll_wait()将返回10然后转到for循环:

for …
Run Code Online (Sandbox Code Playgroud)

c sockets linux epoll

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

链接错误未定义对 Lapack 中“dgels_”的引用

我按照下面的网页在 linux 中安装 ATLAS + Lapack :

http://math-atlas.sourceforge.net/atlas_install/node6.html

bunzip2 -c atlas3.10.1.tar.bz2 | tar xfm -    # create SRCdir
mv ATLAS ATLAS3.10.1                          # get unique dir name
cd ATLAS3.10.1                                # enter SRCdir
mkdir Linux_C2D64SSE3                         # create BLDdir
cd Linux_C2D64SSE3                            # enter BLDdir
../configure -b 64 -D c -DPentiumCPS=2400 \   # configure command
  --prefix=/home/whaley/lib/atlas \           # install dir
  --with-netlib-lapack-tarfile=/home/whaley/dload/lapack-3.4.2.tgz
make build                                    # tune & build lib
make check                                    # sanity check correct answer
make ptcheck                                  # sanity check parallel
make time                                     # …
Run Code Online (Sandbox Code Playgroud)

linux lapack

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

_mm_pause在Intel上的gcc用法

我已参考此网页:https : //software.intel.com/zh-cn/articles/benefitting-power-and-performance-sleep-loops ,以下内容我无法理解:

暂停指令向处理器提示调用线程处于“旋转等待”循环中。此外,在不支持Intel SSE2的x86体系结构上使用时,pause指令是无操作的,这意味着它仍将执行而无需做任何事情或不会引起故障。虽然这意味着不支持Intel SSE2的较早的x86架构不会看到暂停带来的好处,但这也意味着您可以保持一条通向整个主板的简单代码路径。

我想知道,Linux中的lscpu会显示cpu信息,但是我不知道我是否支持SSE2的cpu,如何自己检查?

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                24
On-line CPU(s) list:   0-23
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Model name:            Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz
Stepping:              2
CPU MHz:               3599.882
BogoMIPS:              6804.22
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22 …
Run Code Online (Sandbox Code Playgroud)

linux x86 sleep intel pause

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

sched_setscheduler 适用于所有线程还是主线程?

我有以下来源喜欢 SCHED_RR 优先级 90 :

int main(int argc, char** argv)
{
    const char *sched_policy[] = {
    "SCHED_OTHER",
    "SCHED_FIFO",
    "SCHED_RR",
    "SCHED_BATCH"
    };
    struct sched_param sp = {
        .sched_priority = 90
    };
    pid_t pid = getpid();
    printf("pid=(%d)\n",pid);
    sched_setscheduler(pid, SCHED_RR, &sp);
    printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(pid)]);

    pthread_t tid ;
    pthread_create(&tid , NULL, Thread1 , (void*)(long)3);
    pthread_create(&tid , NULL, Thread2 , (void*)(long)3);
    pthread_create(&tid , NULL, Thread3 , (void*)(long)3);
    while(1)
        sleep(100);
}
Run Code Online (Sandbox Code Playgroud)

而shell“top”,我可以看到该进程具有-91的PR,看起来它可以工作,据我所知,在Linux中,thread1和thread2和thread3是与主线程不同的任务,它们只是共享相同的虚拟内存,我想知道在这个测试中,我是否需要添加

pthread_setschedparam(pthread_self(), SCHED_RR, &sp);
Run Code Online (Sandbox Code Playgroud)

对于所有线程 1、线程 2 和线程 3,所有这 3 个都可以使用 SCHED_RR 进行调度?!或者我不需要这样做?!以及如何观察 …

c linux scheduled-tasks thread-priority

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

/proc/$pid/maps 中的“删除”是什么意思?

我下载了 libhugetlbfs.so 并有一个简单的测试源:

int glbarr[1024*1024]={0} ;
int main()
{
    char * ptr ;
    ptr = (char *) malloc( 1024 * 1024 * 1 ) ;
    printf(" press any key to go on \n");
    getchar() ;
    for(int idx=0;idx<100;idx++){
        char strtmp[64] = {0} ;
        sprintf(strtmp,"%020d",idx) ;
        strcpy( ptr+1024*idx , strtmp ) ;
    } //for 
    for(int idx=0;idx<100;idx++){
        glbarr[idx] = idx ;
    }
    printf(" press any key to go on \n");
    getchar() ;
} // main
Run Code Online (Sandbox Code Playgroud)

然后设置环境:

export LD_PRELOAD=libhugetlbfs.so
export HUGETLB_MORECORE=yes
export HUGETLB_DEBUG=1
Run Code Online (Sandbox Code Playgroud)

最后,执行 …

elf linux-kernel huge-pages

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

如何强制cpu内核刷新c中的存储缓冲区?

我有一个具有2个线程的应用程序,与内核1关联的线程A和与内核2关联的线程B,内核1和内核2在同一x86套接字中。

线程A忙于整数x的旋转,线程B在某些情况下会增加x,当线程B决定增加x时,它将使x所在的缓存行无效,并根据x86 MESI协议,它将新的x存储到存储缓冲区在core2收到无效ack之前,然后在core2收到无效ack之后,core2刷新存储缓冲区。

我想知道,在core2收到无效ack之后,core2刷新是否立即存储缓冲区?我是否有可能迫使cpu用C语言执行刷新存储缓冲区?因为在我的情况下,core1旋转x的线程A应该尽早获得x新值。

c multithreading cpu-architecture

2
推荐指数
1
解决办法
220
查看次数

C++ 11"自动"到非C++ 11编译器

我从中下载了源代码

http://matt.eifelle.com/2012/07/17/just-a-small-example-of-numerical-optimization-in-c/

并尝试在g ++ 4.4.6中编译,它不知道以下来源的auto:

  auto optimizer = Optimization::Local::build_simplex( 
  fun,
  Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
      Optimization::Local::RelativeValueCriterion<float>(ftol))); 
Run Code Online (Sandbox Code Playgroud)

阅读网页,我知道这是因为C++ 11支持auto,所以我尝试搜索我下载的内容,有一个simplex.h,它有以下源代码:

template<class Function, class Criterion>
static Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> build_simplex(const Function& fun, const Criterion& criterion)
{
  return Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion>(criterion);
}
Run Code Online (Sandbox Code Playgroud)

然后我改变了

auto optimizer  
Run Code Online (Sandbox Code Playgroud)

Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer
Run Code Online (Sandbox Code Playgroud)

或者

Optimization::Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer
Run Code Online (Sandbox Code Playgroud)

没有人会通过编译器!!

我不太了解c ++的模板用法,除了得到一个c ++ 11编译,我应该为这个自动做什么返回数据类型修改?

更新:

感谢好心帮我修改要int optimizer和编译,我得到了: test_rosenbrock_simplex.cpp:44: error: cannot convert Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, …

c++ g++ c++11

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

C中的指针/数组问题

我关注了以下网页:

http://www.1024cores.net/home/lock-free-algorithms/reader-writer-problem/improved-lock-free-seqlock

来源如下:

struct data_t 
{ 
    int seq; // sequence number 
    int data [1024]; // user data 
}; 

struct seqlock_t 
{ 
    data_t* current; 
    data_t pool [16]; // 16 user objects are held 
}; 

seqlock_t sl; 
Run Code Online (Sandbox Code Playgroud)

结构很简单,让我困惑的是:

data_t* d0 = sl.current; // load-consume
int idx = (sl.current - sl.pool + 1) % 16; 
data_t* d = &sl.pool[idx]; 
Run Code Online (Sandbox Code Playgroud)

sl.current是一个指针,sl.pool是什么?当前的池可以实现什么?在c language视图中,我该如何解释这个陈述?

int idx = (sl.current - sl.pool + 1) % 16;
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢所有信息,它帮了很多!!! 在我自己的编码风格中将使用int idx =(sl.current - …

c arrays pointers

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