作者ggg12345 (ggg)
站内Programming
标题Re: [问题] 有关古老程式跑在多核平台上的问题?
时间Sun Aug 2 16:57:46 2009
※ 引述《lkerr (kerr)》之铭言:
: 标题: [问题] 有关古老程式跑在多核平台上的问题?
: 时间: Sat Aug 1 23:44:56 2009
:
: 不知道po在这个版上会不会不适合,由於有一些古老的程式, 没有原始码,
: 程式没有对多核心作最佳化, 那有没有方法在作业系统之上, 建立一个虚拟
: 单核环境, 实际上这个虚拟环境却有效利用多核心的效能, 这样就能不用更
: 改程式却能大大提升程式的效能, 作业系统可以是windows 或 linux
: 不知有没有这样的解决方案, 感谢
========
用软体方法让单一的单核老程式在多核下变快, 目前应该没啥现成的办法.
如果是让多个程式在多核心机下一起跑, 不因多程式分时而变慢, intel
是做了相当多的努力, 多段程式相互间乱序交错跑, 塞满可用资源的管线,
但不改各段原次序, 以硬体协助指令排程的做法, intel 是费力做了. 目
前则是改用 compiler 做指令预排程以减少硬体成本.
Virtual Machine 是可能让多个老程式在多核下一起跑, 但总耗费时间是
能界於单核单机与多机各跑其一之间.
这问题很有趣也很有挑战性 ! 先要谈可能性与做法存在否 ?
没有 source program , 也是可以把机器码当 source code 拿来转换解译,
所以, 可能性是存在的.
平行处理的要求就是片段程式与资料间没有前後相依性, 先做後做不影响结
果的就行. Data parallel 就是其一, 如同在大图内找东西, 可分成小图,
各段各自处理. 这种方式的只要加前补後再用老程式就能平行变快, 但要考
虑现在的多核并非多处理机架构, 可能只是多个多种处理单元, 假如浮点运
算器只有一组, 资料若都靠浮点运算那也是架构对不拢.
其次是有前後次序性, 能用生产管线(pipleline)串接, 同时同步各做各
的工作, 矩阵回圈通常有这种性质, 多少能用之再变快一点.
这种做法可能就是 run-time 才做 code parallel & optimization ! 资讯
不太足够, 但要能学习与预测.
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 202.86.171.101
: → tinlans:就算有我想实用性也是堪虑。 118.160.109.251 08/02 03:48
: → freesamael:目前没有 118.231.88.113 08/02 12:20
: → haryewkun:如果你的程式是单程的,那麽在不改程式 60.49.44.200 08/02 13:19
: → haryewkun:的前提下,在任何平台下执行都是单程的 60.49.44.200 08/02 13:20
: → haryewkun:,不可能说换了平台它就变成多核心的。 60.49.44.200 08/02 13:20
: → haryewkun:单机的游戏,不会因为换一换平台就变成 60.49.44.200 08/02 13:21
: → haryewkun:mmorpg啊…… 60.49.44.200 08/02 13:21
: 推 leicheong:核心转换间context switching的 219.73.23.124 08/02 14:32
: → leicheong:overhead大概会把这样做的好处消耗殆尽. 219.73.23.124 08/02 14:33
: → leicheong:这样做没有好处的... 219.73.23.124 08/02 14:33
各干各的, 不要切换不就没 context switching ?
: 推 StubbornLin:要如何有效利用多核效能 这点很难 118.170.94.59 08/02 15:12
: → StubbornLin:什麽东西可以并行做 什麽不可以 118.170.94.59 08/02 15:12
: → StubbornLin:单行程的程式很难把它拆成平行的吧 118.170.94.59 08/02 15:13
: 推 sunneo:顶多把system call弄thread帮忙吧 118.171.80.193 08/02 15:20
想到病毒码加挂於各程式, 还能各自同时随着同时跑就令人激赏 !
不改原程式也行 ! 没限制不能复制一部份补綷加挂吧 !
果真是超级挑战的难题 ! 跟基因改造有拼 !
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.4.12
1F:→ tinlans:我觉得这一定有人会拿来发论文打嘴炮拿学118.160.109.251 08/02 17:18
2F:→ tinlans:位用,但是要实用的话可能性可说是没有。118.160.109.251 08/02 17:19
3F:→ tinlans:而且九成九的机率一定是做苦力搞出来的。118.160.109.251 08/02 17:19
4F:→ ggg12345:论文要有证明或模拟数据,资料平行最容易 140.115.4.12 08/02 17:39
5F:→ ggg12345:但大家都知,加綷转译是不说嘴高人干的事! 140.115.4.12 08/02 17:43
6F:→ ggg12345:国内多核心计划都在新竹帮的地盘转!难免! 140.115.4.12 08/02 17:45
7F:→ ggg12345:新竹帮地区出论文的量与速,有目共睹吧! 140.115.4.12 08/02 20:10
8F:推 leicheong:除了用functional prog. lang.写的以外, 219.73.23.124 08/03 23:49
9F:→ leicheong:一般程式没多线程考量的话, 要在多核 219.73.23.124 08/03 23:49
10F:→ leicheong:平行跑已经机会不大了... 还要要求没 219.73.23.124 08/03 23:50
11F:→ leicheong:context switching吗? 这是在做会帮你 219.73.23.124 08/03 23:51
12F:→ leicheong:自动重写的AI吗? :OOOOO 219.73.23.124 08/03 23:51
13F:→ leicheong:病毒码加载通常是透过hook的方式在呼叫 219.73.23.124 08/03 23:54
14F:→ leicheong:API时被「顺道」执行那样? 要不就是直接 219.73.23.124 08/03 23:55
15F:→ leicheong:以另一process执行... 不论那种方式都是 219.73.23.124 08/03 23:57
16F:→ leicheong:本身已替多线执行的方式做了规划才可 219.73.23.124 08/03 23:58
17F:→ leicheong:成立吧... 219.73.23.124 08/03 23:58
==========
多核是多个 function unit , 多组 register set , 多个 instruction
pointer 共同放在同一个 chip 之内. 为了省电, 配合 MOS Device 的
clock 不能那麽高速, 但多核的内部如同 RISC Processor 一样, 也没
必要让 register set 与 FU 是随各核完全分离的, 各核可以做到动态
配属, 配不到资源就等.
假设有 四核 有四个 instruction pointer , 四个 ip 可指在同一程式
码块上, 但 data oprand 的 index base 起始值不同, 所以执行时, 是
取出不同记忆体的资料各自运算, 这是 data parallel. 这个多核是在
同一个 chip 内, 可以把 MIMP 当成 SIMP 使用, 就可以有 array
computing 的效能, 这是偏计算. 若是夹杂着各种不同偏重的多工程序,
应该要能动态调配资源来用.
高阶语言产生的 pattern 都是固定的形式, 老式程式在没有 optimization
前是容易被辨识的. 多数矩阵就能被分割成 data parallel . 矩阵运算的
前後分叉合并点就可以用病毒码方式的 patch code 完成.
这可能是苦功, 但要害的点就那几处. 老式的病毒可以查出挂点, 还能去除
还原. 这个 optimization 则是改造程式码, 若有多核可用就使用 data
parallel, 没有就照旧, 所以是基因改造.
可并行部份, 新式的可以让 programmer 宣告, 老式的就靠自动检视转换与
标记, 对标记的後续处理与进一步转换调派就可由 VMM 来做.
主要的重点是: 这是一件可持续发展的事业, 需求因多核硬体的来临而存在.
实用就是要能从 嘴泡讨论, 逐步变成可行, 可试, 值得一试, 可用.
※ 编辑: ggg12345 来自: 140.115.4.12 (08/04 12:04)
18F:推 leicheong:因此, 我就说你这目标是写出「可以自动 219.73.23.124 08/04 20:35
19F:→ leicheong:重写程式」的AI罗... 你说的这些跟制作 219.73.23.124 08/04 20:36
20F:→ leicheong:interpreter的复杂度相差不远, 你就认为 219.73.23.124 08/04 20:37
21F:→ leicheong:这些动作在执行上的overhead不会比 219.73.23.124 08/04 20:38
22F:→ leicheong:context switching大吗? :P 219.73.23.124 08/04 20:38
23F:推 leicheong:还有, 大部份病毒都不会去找挂点, 只是 219.73.23.124 08/04 20:41
24F:→ leicheong:写一个「壳」把病毒码後的所有部份以 219.73.23.124 08/04 20:42
25F:→ leicheong:LoadModule的形式载入并执行. 挂hook 219.73.23.124 08/04 20:42
26F:→ leicheong:的相象也只是几个常用的function call, 219.73.23.124 08/04 20:43
27F:→ leicheong:不用想得太复杂的... 219.73.23.124 08/04 20:44
=======
这题本来就是 parallel compiler , 要称 AI 也可. 先偷懒找特定的
pattern 先标记转换. 执行时, 这部份就 自动trap 进入特殊的模组
(vmm), 由之先调派多核针对事先已对 array data 大回圈标记好之处,
利用多核与多个功能单元, 完成平行与管线计算, 就可改善最主要部
份的效率.
老式解毒还原的技术不就类似上述的动作 ?
专针对少数 pattern , 事情就不会是那麽难解 !
多核若只将多机的 processor unit 复制置於同一个 chip , 原本透
过 bus 共用记忆体的方式就变成是多核共用 cache , 这会使得 cache
的共用 bus 变得非常高速而更耗电. 若使用分隔的 cache 与各自衔接
的 bus 就无此问题, 但彼此互通转送结果形成 pipleline 的效用就会
减弱. 多核对内部 register 与 cache , 各个 function unit 的配属
终究会应需要而继续演化, 从极端来看就是从多核的 MIMP 可以动态调
整成相当於一个单核的 SIMP 效果.
多机共用记忆体架构的对策是将 single process 变成 multi-thread,
是 task/thread level 的平行运算. 但从 MIMP 变成 SIMP 的运算就
相当於将长串多个指令码转化为少数几个 VLIW 指令, 让各个 function
unit 在 instruction level 同时并行处理.
假如仅把多核内部资源都配属於同一个程式, 那就没有 context switch
的必要. 有了随时将结果暂存的 register/cache 当缓冲, 可动态配属与
调整的不等配置多核, 在每次存回结果下就能减化 context switching.
换言之, 多核的资源在动态可调整下, 形成一个相当於 单核的RISC处理
器, 拥有大部份的 register set 与 function unit 在 VLIW 的指令下
让各个功能单元平行运作.
※ 编辑: ggg12345 来自: 140.115.4.12 (08/05 08:11)