首长笑了:“老刘,你这个比方打得好。我懂了。”
他看向陈教授:“陈教授,你这个思路,我支持。但问题来了,这个多核心的机器,现在能造吗?”
陈教授摇摇头:“造不了。技术上还有很多难题没解决。”
“那你说这个干什么?”首长问。
陈教授笑了笑:“首长,我说这个,不是要现在就造。我是希望,在宋教授设计这个核心的时候,给它留几个接口,留几条线,让它将来能跟别的核心连起来。就像盖房子,现在只盖一间,但地基要打好,将来想加盖的时候,直接往上接就行,不用把房子拆了重盖。”
首长点点头,看向宋颜:“宋教授,你能留这个接口吗?”
宋颜想了想:“能。但要多占几个引脚,多几条控制线。”
“占就占。”首长说,“现在多花点功夫,将来少走弯路。”
陈教授说完,台下沉默了。
但沉默只持续了几秒,就有人举手。
是秦世襄。
“陈教授,您这个思路,我支持。但我有几个技术问题,想问清楚。”
他站起来,走到台上,拿起粉笔。
“第一,通信瓶颈。”他在黑板上画了两个方块,中间画了一条线,“两个核心之间交换数据,这条路有多宽?能跑多快?如果这条路太窄,数据堵在路上,就算有100个核心,也只能干等着。”
他看着陈教授:“您那个全局管理核心,怎么保证数据通路不堵?”
陈教授想了想:“这个问题,我现在没有现成的答案。但方向是明确的。第一,数据通路要足够宽。不能只是一根线,要一组线。第二,交换方式要高效。不能一个核心发完数据另一个才能发,要能并行交换。第三,协议要简单。越复杂的协议越慢。”
秦世襄点点头,在黑板上写下“通信瓶颈”四个字。
包康建举手了。
他走到台上,拿起粉笔,在秦世襄写的“通信瓶颈”旁边,又写了四个字:“同步难题”。
“陈教授,秦教授说的是数据通路的问题。我说的是时间同步的问题。”
他指着黑板上的两个方块:“两个核心一起算一个任务,怎么保证它们步调一致?核心A算得快,核心B算得慢,A等不等B?如果不等,结果怎么拼?如果等,快的那个就闲着,效率上不去。”
他看向陈教授:“这个同步问题,比通信瓶颈更难。几十个核心要同步,需要非常复杂的时钟网络和控制逻辑。”
陈教授点点头:“包教授说得对。同步是并行计算的死穴。但也不是完全无解。”
他走到黑板前,在“同步难题”旁边又写了几个字:“松耦合”、“异步并行”。
“一种思路,是松耦合。让各个核心相对独立,不需要每步都同步。A算完自己的那块,结果先放着;B算完自己的那块,也先放着。等所有核心都算完了,再统一合并。这叫‘分而治之,异步执行’。”
“另一种思路,是异步并行。每个核心按自己的节奏跑,需要数据交换的时候,通过握手信号来协调。你给我发个信号,说你算完了;我收到信号,知道可以取你的结果了。这样不需要全局同步,只需要局部协调。”
他放下粉笔:“这两种思路,都比紧耦合、全局同步容易实现。但代价是,编程复杂。程序员要想清楚,什么时候该同步,什么时候可以异步。”
包康建点点头,在本子上记了几笔。
魏知远举手了。
他走到台上,拿起粉笔,在“同步难题”旁边,又写了四个字:“负载均衡”。
“陈教授,包教授说的是时间同步的问题。我说的是任务分配的问题。”
他指着黑板上的两个方块:“一个任务切分成两块,分给两个核心。如果这两块一样大,两个核心同时算完,完美。但如果一块大一块小,大的那个算半天,小的那个算完就闲着,浪费。”
“这叫负载不均衡。几十个核心的情况下,任务切分要做到完全均衡,几乎不可能。总有一些核心忙死,一些核心闲死。”
他看向陈教授:“这个问题怎么解?”
陈教授想了想:“魏教授,这个问题,没有完美解。只能靠动态调度。”
他在黑板上写下“动态调度”四个字。
“不是事先把任务切死。是准备一个任务池,谁算完了,自己来池子里取下一个任务。这样算得快的核心多干点,算得慢的核心少干点,大家都不闲着。”
“代价是,任务池的访问会变成新的瓶颈。所有人都来池子里取任务,池子门口的队就排长了。”
魏知远点点头,在本子上记了一笔。
刘星海站起来。