前两天在PPC上做性能优化的时候,需要确切的知道某些函数的执行时间以求分析性能瓶颈(bottle neck)。于是用汇编指令去读取一个特定的寄存器获取一个cycle值,当进入一个代码区域时读取一下,出去时读取一下,两个值想减就获得整个代码区域的执行cycle。 可是在多核环境下,很可能程序会在不同的cpu上执行,而各个cpu的频率有可能不一样,最后得到的cycle数就不准确。为了得到准确的值,只有在程序执行之前将执行程序的进程绑定到某个特定的cpu上。怎么绑定?在pthread.h里面有标准的函数,但是我发现在AIX上这些函数没有定义。Google了一把,终于找到了AIX上绑定cpu的命令和API。
解决办法:
在AIX上有两种方法可以绑定cpu,第一种是通过执行命令绑定;第二种是在你的程序中调用它提供的API。
1. command:
To query for the available processors on the machine, try:
查看可用的cpu:
# bindprocessor -q
The available processors are: 0 1
绑定进程到某个cpu:
Bind the p1 processes, whose process id is 14662 to processor 1:
# bindprocessor 14662 1
查看绑定结果:
Check to make sure the process is bound to the specified processor:
#ps -emo THREAD grep p1
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
root 4460 5428 - A 0 60 7 f0145c10 240001 - - /usr/sbin/rpc.mountd
root 4710 5428 - A 0 60 4 * 240001 - - /usr/sbin/tftpd -n
root 14662 10566 - A 120 126 0 - 200001 pts/0 1 ./p1
取消绑定:
Unbind the process:
# bindprocessor -u 14662
Check the result of the above command:
# ps -emo THREAD grep p1
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
root 12672 10566 - A 1 60 1 50a05e84 200001 pts/0 - grep p1
root 14662 10566 - A 78 111 0 - 200001 pts/0 - ./p1
2. 调用AIX上的API:
首先所有的API定义在: #include
1) sysconf(_SC_NPROCESSORS_CONF); //获取当前配置的cpu数目
2) sysconf(_SC_NPROCESSORS_ONLN);//获取当前可用的cpu数目
3) bindprocessor(BINDPROCESS, pid, bindparameter);//绑定当前进程到指定cpu。 其中pid是当前进程的pid, bindparameter是想绑定的cpu id。
在做绑定之前一定要查询当前可用的cpu数,如果为0则无法绑定。
当你执行程序时,可以用前面提供的命令去查询你的进程是否绑定成功。
