x**l 发帖数: 64 | 1 谢谢你指出错误,匆忙之中修改的,没有测试.
如果你的CPU不支持 rdtscp,请使用这个function
typedef unsigned long long ticks;
static __inline__ ticks getticks(void)
{
unsigned a, d;
asm volatile(
"rdtsc;"
: "=a" (a), "=d" (d)
:
: "memory");
asm volatile("cpuid"
:
:
: "%eax", "%ebx", "%ecx", "%edx");
return ((ticks)a) | (((ticks)d) << 32);
}
你没有用numactl去调用,所以即使修改了代码,结果也不准确。
这是我的sample 输出
$ sudo numactl --physcpubind=3 --membind=0 ./a_i... 阅读全帖 |
|
x**l 发帖数: 64 | 2
FT,还是错的。请接着改。
---我改为两个lfence夹一个rdtsc,如果你还觉得不正确,麻烦你明示你认为正确的办法.
+++++++++++++
请问你是在 Intel 工作吗?你能用 Intel 内部结构去
推断 CPU 的行为而忽视 Intel 手册。
如果你对 1000 cycle 的误差感兴趣,
为什么你不按照 Intel 建议的方式使用 rdtsc 和 rdtscp?
----我始终不认为这1000个cycle是由于rdtscp/rdtsc造成的,道理很简单,最终计算的
是两次clock值的difference,而不是绝对值,在一个working()和gap()交替执行的循环
中,不管out-of-order execution怎么跳,rdtsc测测了误差都不会造成一种是working()
的时间是
1100左右, 1100左右, 1100左右,1100左右,1100左右,...
另一种是
2500左右, 2500左右, 2500左右, 2500左右, 2500左右, ....
++++++++++++++++++++++++++++++++++++
你前面根本没有给... 阅读全帖 |
|
x**l 发帖数: 64 | 3 sample code我放在这个link
https://onedrive.live.com/?cid=96AAD7C8AEF82405&id=96AAD7C8AEF82405!108
用这个命令可以在linux上用gcc 4.4或者更高版本build
g++ -O3 -std=c++0x -march=native -ftemplate-depth-1025 main_inline.cpp -o a_
inline_opt.out
参考启动命令分别是这样的
短时延
sudo numactl --physcpubind=3 --membind=0 ./a_inlin_opt.out 1 0
长时延
sudo numactl --physcpubind=3 --membind=0 ./a_inlin_opt.out 1 2999999999
启动后还需要用 "sudo -f -p [priority] 改变调度策略,然后按任意键继续.
谢谢大家了.
编辑:
SSA指出clock测量方法不准确,虽然最后结果还是类似,但为排除意外,我还是将
onedriver上的sample co... 阅读全帖 |
|
x**l 发帖数: 64 | 4 如果你运行了我的代码就知道,schedule会被chrt改为fifo 的 10, 并make sure 这个
core上没有高于这个的thread了.
IRQ handler 通过修改 /proc/irq/* 可以mask掉, numactl决定了这个process没法再
几个core上跳来跳去.
rdtsc/rdtscp是可以在priviledge level 3运行的.
请问在kernel mode里怎么锁住当前cpu,通过numactl/cpuset? |
|
x**l 发帖数: 64 | 5 sample code我放在这个link
https://onedrive.live.com/?cid=96AAD7C8AEF82405&id=96AAD7C8AEF82405!108
用这个命令可以在linux上用gcc 4.4或者更高版本build
g++ -O3 -std=c++0x -march=native -ftemplate-depth-1025 main_inline.cpp -o a_
inline_opt.out
参考启动命令分别是这样的
短时延
sudo numactl --physcpubind=3 --membind=0 ./a_inlin_opt.out 1 0
长时延
sudo numactl --physcpubind=3 --membind=0 ./a_inlin_opt.out 1 2999999999
启动后还需要用 "sudo -f -p [priority] 改变调度策略,然后按任意键继续.
谢谢大家了. |
|
x**l 发帖数: 64 | 6 【 以下文字转载自 Programming 讨论区 】
发信人: xybl (xybl), 信区: Programming
标 题: 请教:属于google不到答案的问题
发信站: BBS 未名空间站 (Wed Apr 23 21:49:44 2014, 美东)
linux下的一段代码,single thread,可以独占一个cpu 100%的资源。最主要部分就是
这个loop
for (uint32_t i = 0; i < 10; i++)
{
working(pBuf, bufferNum);
gap(gapLoops);
}
working()会做一些有business 意义的操作,
gap()就是很简单的一个双循环去制造一些时延在两次working()之间。
如果gap()只运行很短的时间,例如34个cpu clock cycles,则working()在iteration
2~10次时用的时间很短,例如,1100个cycles
如果gap()只运行较长时间,两次working()之间的时延有1个second,则wor... 阅读全帖 |
|
l****1 发帖数: 215 | 7 dual socket AMD 6136,要在CentOS 5.5下设置NUMA.
numactl --hardware
available: 1 nodes (0)
node 0 size:
node 0 free:
libnuma: Warning: Cannot parse distance information in sysfs: No such file
or directory
No distance information available.
系统里还没有node.
centoswiki说需要重新complie kernel.需要么?如何添加node,然后配置cpu和mem呢?
哪位给个实例? |
|
x**l 发帖数: 64 | 8 linux下的一段代码,single thread,可以独占一个cpu 100%的资源。最主要部分就是
这个loop
for (uint32_t i = 0; i < 10; i++)
{
working(pBuf, bufferNum);
gap(gapLoops);
}
working()会做一些有business 意义的操作,
gap()就是很简单的一个双循环去制造一些时延在两次working()之间。
如果gap()只运行很短的时间,例如34个cpu clock cycles,则working()在iteration
2~10次时用的时间很短,例如,1100个cycles
如果gap()只运行较长时间,两次working()之间的时延有1个second,则working()在
iteration 2~10次的运行时间会double甚至2.5倍,例如会达到2500个cycles
我已经用numactl和chrt让这个程序充分独占一个cpu core,而且用cpuset把其他
threads移开这个core上.
我的问题是:
... 阅读全帖 |
|
T********i 发帖数: 2416 | 9 你用numactl把CPU 和memory都限制在同一个numa node上面了? |
|
K****n 发帖数: 5970 | 10 concurrency是你这个题里唯一好玩儿的地方,说实话我最讨厌gui和前台了
其实我用python做过一个实验,不用multiprocessing,就用multithreading,有GIL,
运行单进程。在16核, Ubuntu里,用numactl -c,速度可以提高n倍。我觉得可能用
cpuset也行, |
|
z*******n 发帖数: 1034 | 11 【 以下文字转载自 Programming 讨论区 】
发信人: xybl (xybl), 信区: Programming
标 题: 请教:属于google不到答案的问题
发信站: BBS 未名空间站 (Wed Apr 23 21:49:44 2014, 美东)
linux下的一段代码,single thread,可以独占一个cpu 100%的资源。最主要部分就是
这个loop
for (uint32_t i = 0; i < 10; i++)
{
working(pBuf, bufferNum);
gap(gapLoops);
}
working()会做一些有business 意义的操作,
gap()就是很简单的一个双循环去制造一些时延在两次working()之间。
如果gap()只运行很短的时间,例如34个cpu clock cycles,则working()在iteration
2~10次时用的时间很短,例如,1100个cycles
如果gap()只运行较长时间,两次working()之间的时延有1个second,则wor... 阅读全帖 |
|