我在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中在一个带有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) 我有以下程序在不同的编译器编译,并得到不同的行为,
资源 :
#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) 我有一个测试用例来观察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) 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) 我按照下面的网页在 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) 我已参考此网页: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) 我有以下来源喜欢 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 进行调度?!或者我不需要这样做?!以及如何观察 …
我下载了 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)
最后,执行 …
我有一个具有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新值。
我从中下载了源代码
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>, …
我关注了以下网页:
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 - …