“回答比保持沉默更容易”——對事務記憶之父 Maurice Herlihy 的精彩採訪

“回答比保持沉默更容易”——對事務記憶之父 Maurice Herlihy 的精彩採訪

莫里斯·赫利希 - 兩個人的主人 迪克斯特拉獎. 第一個是為了工作 “無等待同步” (布朗大學)和第二個,最近,- “事務內存:無鎖數據結構的架構支持” (弗吉尼亞理工大學)。 Dijkstra 獎頒發給其重要性和影響力在至少十年內一直引人注目的作品,顯然,Maurice 是該領域最著名的專家之一。 他目前是布朗大學的教授,並取得了長篇大論的成就。 現在從事經典分佈式計算背景下的區塊鏈研究。

此前,Maurice已經來俄羅斯參加SPTCC(錄影) 並在聖彼得堡舉辦了一場精彩的 JUG.ru Java 開發者社區會議 (錄影).

這篇 habrapost 是對 Maurice Herlihy 的精彩採訪。 它討論了以下主題:

  • 學術界和工業界的互動;
  • 區塊鏈研究基金會;
  • 突破性的想法從何而來? 人氣影響;
  • 博士在芭芭拉·利斯科夫的指導下;
  • 世界在等待多核;
  • 新世界,新問題。 NVM、NUMA 和架構黑客攻擊;
  • 編譯器與 CPU、RISC 與 CISC、共享內存與消息傳遞;
  • 編寫脆弱的多線程代碼的藝術;
  • 如何教學生如何編寫複雜的多線程代碼;
  • 新版《多處理器編程的藝術》一書;
  • 事務性內存是如何發明的?   
  • 為什麼值得在分佈式計算領域進行研究;
  • 算法的發展是否停止,如何生存;
  • 在布朗大學工作;
  • 大學研究與企業研究的區別;
  • 九頭蛇和SPTDC。

面試由以下人員進行:

維塔利·阿克謝諾夫 — 目前是奧地利 IST 的博士後和 ITMO 大學計算機技術系的一名員工。 從事競爭性數據結構理論與實踐領域的研究。 在加入 IST 之前,他在巴黎狄德羅大學和 ITMO 大學獲得博士學位,師從 Petr Kuznetsov 教授。

阿列克謝·費多羅夫 是 JUG Ru Group 的製作人,這是一家為開發者組織會議的俄羅斯公司。 Alexey 參與了 50 多個會議的籌備工作,從 Oracle(JCK,Java Platform Group)的開發工程師職位到 Odnoklassniki 的開發人員職位,他的簡歷應有盡有。

弗拉基米爾·西特尼科夫 是 Netcracker 的一名工程師。 十年來,他一直致力於 NetCracker OS 的性能和可擴展性,NetCracker OS 是電信運營商用來自動化網絡和網絡設備管理流程的軟件。 對 Java 和 Oracle 數據庫性能問題感興趣。 官方 PostgreSQL JDBC 驅動程序中十多項性能改進的作者。

學術界與工業界的互動

Alexey:Maurice,您在學術界工作了很長時間,第一個問題是關於學術界和產業界的互動。 你能告訴我們他們之間的互動最近發生了怎樣的變化嗎? 20-30 年前是什麼,現在又發生了什麼? 

Maurice:我一直試圖與商業公司密切合作,因為他們面臨著有趣的挑戰。 通常,他們對公佈他們的結果或向國際社會詳細解釋他們的問題都不太感興趣。 他們只對解決這些問題感興趣。 我曾在其中一些公司工作過一段時間。 我在 Digital Equipment Corporation 的研究實驗室全職工作了五年,該公司曾經是一家大型計算機公司。 我每週在 Sun、微軟、甲骨文工作一天,在 Facebook 工作一小會兒。 現在我要休假(美國大學的教授被允許休一年這樣的假,大約每六年一次)並在 Algorand,波士頓就是這樣一家加密貨幣公司。 與公司密切合作一直是一種樂趣,因為這是您了解新事物和有趣事物的方式。 您通常可以成為第一個或第二個就所選主題發表文章的人,而不是逐步改進其他人已經在研究的問題的解決方案。

Alexey:你能告訴我們更多關於這是如何發生的嗎?

莫里斯:當然。 你知道,當我在 Digital Equipment Corporation 時,我和 Elliot Moss 發明了事務性內存。 那是一個碩果累累的時期,每個人都開始對信息技術感興趣。 包括並發性,儘管多核系統還不存在。 在 Sun 和 Oracle 的日子裡,我在並行數據結構方面做了很多工作。 在 Facebook,我參與了他們的區塊鏈項目,我不能談論它,但希望能盡快公開。 明年,在 Algorand,我將在一個研究智能合約的研究團隊中工作。

Alexey:在過去的幾年裡,區塊鏈已經成為一個非常熱門的話題。 對你的研究有幫助嗎? 也許它會更容易獲得贈款或獲得業內公司的資源?

Maurice:我已經收到了以太坊基金會的一筆小額贈款。 區塊鏈的普及對於激勵學生從事這一領域的工作非常有用。 他們對此很感興趣,也很樂意參與其中,但有時他們沒有意識到,表面上聽起來很誘人的研究實際上需要付出艱苦的努力。 然而,我很高興在區塊鏈周圍使用所有這些神秘的東西,它有助於吸引學生。 

但這還不是全部。 我是幾家區塊鏈初創公司的顧問委員會成員。 他們中有些人可能會成功,有些人可能不會,但看到他們的想法、研究他們並向人們提供建議總是很有趣。 最令人興奮的事情是當你警告人們不要做某事時。 很多事情乍一看似乎是個好主意,但真的是這樣嗎?

區塊鏈研究基金會

Vitaly:有些人認為區塊鍊及其算法是未來。 其他人說這只是另一個泡沫。 你能談談你對這個問題的看法嗎?

Maurice:區塊鏈世界中發生的很多事情都沒有正常運作,有些只是騙局,很多事情都被高估了。 但是,我認為這些研究有堅實的科學基礎。 區塊鏈世界充滿意識形態分歧的事實表明了興奮和奉獻的程度。 另一方面,對科學研究也不是特別有利。 現在,如果你發表一篇文章談論特定算法的缺點,收到的反應並不總是完全科學的。 人們經常表達自己的情緒。 我認為在這個領域的這種炒作對一些人來說可能看起來很有吸引力,但最終,還有真正的科學和工程問題有待解決。 這裡有很多計算機科學。

Vitaliy:所以你正在努力為區塊鏈研究奠定基礎,對吧?

莫里斯:我正在努力為一門堅實的、科學的和數學上健全的學科奠定基礎。 部分問題在於,有時你不得不反駁其他人的一些過於苛刻的立場,以忽視他們。 有時人們問我為什麼在一個只有恐怖分子和毒販感興趣的領域工作。 這樣的反應就像追隨者盲目重複你的話一樣毫無意義。 我認為真相介於兩者之間。 區塊鏈尚未對社會和全球經濟產生深遠影響。 但是,由於現代技術,這可能不會發生。 現代技術會發展,未來所謂的區塊鏈會變得非常重要。 也許它甚至看起來都不像現代區塊鏈,這是一個懸而未決的問題。

如果人們發明新技術,他們將繼續稱其為區塊鏈。 我的意思是,就像今天的 Fortran 與 1960 年代的 Fortran 語言毫無關係,但每個人都一直稱它為 Fortran。 UNIX 也一樣。 所謂的“區塊鏈”尚未發生革命。 但我懷疑這個新的區塊鏈會像今天每個人都喜歡使用的那樣。

突破性的想法從何而來? 人氣影響

Alexey:從科學的角度來看,區塊鏈的流行是否帶來了新的成果? 該地區更多的互動、更多的學生、更多的公司。 這種受歡迎程度的增長是否已經產生了任何結果?

莫里斯:當有人遞給我一張公司的官方傳單時,我對這個產生了興趣,這家公司剛剛籌集了很多資金。 她寫了關於 拜占庭將軍的任務我對此非常熟悉。 傳單中所寫在技術上顯然是不正確的。 寫這篇文章的人並沒有真正理解問題背後的模型……然而這家公司籌集了很多資金。 隨後,該公司悄悄地用更正確的版本替換了這份傳單——我不會說這家公司的名字是什麼。 他們仍然存在並且做得很好。 這個案例讓我相信,首先,區塊鏈只是一種分佈式計算。 其次,准入門檻(當時是四年前)相當低。 在這方面工作的人非常有活力和聰明,但他們不讀科學論文。 他們試圖重新發明已知的事物,但他們做錯了。 今天的戲劇已經減少了。

Alexey:這很有趣,因為幾年前我們有不同的趨勢。 這有點像前端開發,瀏覽器界面開發人員重新發明了當時已經在後端流行的整個技術:構建系統、持續集成等等。 

莫里斯:我同意。 但這並不奇怪,因為真正具有突破性的想法總是來自既定社區之外。 成熟的研究人員,尤其是學術界的權威,不太可能做任何真正具有開創性的事情。 為下一次會議寫一份報告,說明您如何略微改進了過去的工作成果,這很容易。 去參加一個會議,和朋​​友聚在一起,談論同樣的事情。 而那些帶著突破性想法闖進來的人,幾乎都是外來的。 他們不了解規則,他們不懂語言,但仍然...圖片。 從某種意義上說,可以嘗試將外部的、更流暢的發展與我們已經了解的技術結合起來。 作為第一步,嘗試創建一個科學基礎,然後對其進行修改,以便將其應用於新的突破性想法。 我認為區塊鏈非常適合新的突破性想法。

阿列克謝:你認為為什麼會這樣? 因為“外面”的人在社區中沒有任何固有的特定障礙?

莫里斯:這裡有一個模式。 如果您總體上閱讀了印象派在繪畫和藝術方面的歷史,那麼著名藝術家曾一度拒絕印象派。 他們說這是某種幼稚。 一代人之後,這種以前被拒絕的藝術形式成為了標準。 我在我的領域看到的:區塊鏈的發明者對權力、對結束出版物和引文索引不感興趣,他們只是想做點好事。 於是他們坐下來開始做。 他們缺乏一定的技術深度,但這是可以解決的。 想出新的創意比糾正和放大不夠成熟的創意要困難得多。 感謝這些發明家,我現在有事可做!

Alexey:這類似於初創公司和遺留項目之間的區別。 我們繼承了很多思想局限、障礙、特殊要求等等。

Maurice:一個很好的類比是分佈式計算。 將區塊鏈想像成一家初創公司,將分佈式計算想像成一家大型老牌公司。 分佈式計算正在被收購併與區塊鏈合併。

芭芭拉·利斯科夫博士

Vitaliy:我們還有很多問題! 我們一直在研究您的簡歷,並發現了一個關於您的博士學位的有趣事實。 是的,那是很久以前的事了,但話題似乎很重要。 您在以下人員的指導下獲得了博士學位 芭芭拉·利斯科夫! Barbara 在編程語言開發社區中非常有名,而且是非常有名的人。 您的研究屬於編程語言領域,這是合乎邏輯的。 您是如何轉向並行計算的? 你為什麼決定改變話題?

Maurice:當時,Barbara 和她的團隊只關注分佈式計算,這是一個非常新的想法。 也有人說分佈式計算是扯淡,計算機之間的通信沒有意義。 分佈式計算中考慮的問題之一是容錯性,這將它們與集中式計算區分開來。 經過大量研究,我們決定在分佈式計算的編程語言中,您需要有類似原子事務的東西,因為您永遠無法確定遠程調用是否會成功。 一旦有了事務,就會出現並發控制的問題。 然後在獲得高度並行的事務數據結構方面進行了大量工作。 然後當我畢業時我去了 卡耐基梅隆大學 並開始尋找工作主題。 我突然想到,計算已經從個人計算機轉移到計算機網絡。 進步的自然延續將是多處理器——那時“多核”這個詞還不存在。 我想:多核系統的原子事務相當於什麼? 絕對不是普通的交易,因為它們太大太重了。 這就是我想出這個主意的方式 線性度 這就是我想出整個免等待同步的方式。 它試圖回答什麼是具有共享內存的多處理器系統的原子事務模擬的問題。 乍一看,這部作品可能看起來很不一樣,但實際上它是同一主題的延續。

等待多核的世界

Vitaly:您提到當時很少有多核計算機,對嗎?

莫里斯:他們只是不存在。 有幾個所謂的對稱多處理器,它們基本上連接到同一條總線上。 它運行得不是很好,因為每次新公司創建這樣的東西時,英特爾都會發布一個性能優於多處理器的單處理器。

阿列克謝:那豈不是說在古代更多的是理論研究?

莫里斯:這不是理論性的,而是推測性的研究。 所有這一切都不是關於使用大量定理,而是我們提出了當時不存在的架構的假設。 這就是研究的目的! 沒有公司會這樣做,這一切都來自遙遠的未來。 事實上,這一直持續到 2004 年,那時真正的多核處理器出現了。 由於處理器過熱這一事實,您可以使處理器更小,但不能使其更快。 因此,出現了向多核架構的過渡。 然後這意味著突然間我們過去開發的所有概念都有用了。

Alexey:為什麼您認為多核處理器只出現在 XNUMX 年代? 那麼為什麼這麼晚?

Maurice:這是由於硬件限制。 英特爾、AMD 和其他公司非常擅長提高處理器速度。 當處理器在某個時候變得足夠小以至於它們無法再提高時鐘速度時,因為處理器會開始燒毀。 你可以讓它們更小,但不能更快。 他們的力量是什麼——不是一個非常小的處理器,而是在相同體積的機箱中安裝八個、十六個或三十二個處理器,而以前只能安裝一個。 現在你有了多線程和它們之間的快速通信,因為它們共享緩存。 但是你不能讓它們跑得更快——有一個非常具體的速度限制。 他們繼續一點一點地改進,但沒有那麼多。 物理定律擋住了路。

新世界,新問題。 NUMA、NVM 和架構黑客

阿列克謝:聽起來很有道理。 新的多核處理器帶來了新的問題。 您和您的同事是否預料到這些問題? 也許您已經提前研究過它們? 在理論研究中,預測這些事情往往不是很容易。 當問題確實發生時,它們在多大程度上符合您和您同事的期望? 或者它們是全新的,您和您的同事不得不花很多時間解決出現的問題?

Vitaliy:我將補充 Alexey 的問題:您在研究理論時是否正確預測了處理器的架構?

莫里斯:並非所有 100%。 但我認為我和我的同事在預測共享內存多核方面做得很好。 我認為我們正確地預測了設計無鎖並行數據結構的困難。 這種數據結構對許多應用程序都很重要,儘管不是對所有應用程序都重要,但通常您確實需要無鎖數據結構。 當我們發明它們時,許多人認為這是無稽之談,只要有鎖,一切都可以正常工作。 我們很好地預見到,許多編程問題和數據結構問題都會有現成的解決方案。 還有更複雜的問題,比如 NUMA – 內存訪問不均勻。 事實上,直到多核處理器發明之前,它們甚至都沒有被考慮過,因為它們太具體了。 研究界致力於解決通常可以預測的問題。 與特定架構相關的一些硬件問題不得不等待 - 事實上,這些架構的出現。 例如,沒有人真正研究 GPU 特定的數據結構,因為當時 GPU 還不存在。 儘管已經做了很多工作 單指令多數據流,一旦合適的硬件出現,這些算法就可以使用了。 然而,不可能預測一切。

Alexey:如果我理解正確的話,NUMA 是成本、性能和其他一些東西之間的一種折衷。 知道為什麼 NUMA 來的這麼晚嗎?

Maurice:我認為 NUMA 的存在是因為用於製造內存的硬件存在問題:組件距離越遠,訪問速度越慢。 另一方面,這種抽象的第二個價值是記憶的統一性。 因此,並行計算的特點之一就是所有的抽像都被稍微打破了。 如果訪問是完全統一的,那麼所有內存將是等距的,但這在經濟上,甚至可能在物理上是不可能的。 所以這個矛盾就產生了。 如果您編寫程序時就好像內存是統一的一樣,那麼它很可能是正確的。 從某種意義上說,它不會給出錯誤的答案。 但是她的天上星星的表現是不會搶的。 同樣,如果你寫 自旋鎖 在不了解緩存層次結構的情況下,鎖本身是正確的,但是您可以忘記性能。 從某種意義上說,你必須編寫建立在非常簡單的抽象之上的程序,但你必須比給你抽象的人更聰明:你必須知道在抽象之下有一些內存層次結構,有你和這個記憶之間的總線,等等。 因此,本身有用的抽象之間存在一些衝突,這導致我們遇到非常具體和實用的問題。

維塔利:未來呢? 您能預測處理器將如何進一步發展嗎? 有一種想法認為答案之一是事務性內存。 您可能還有其他庫存。

Maurice:前面有幾個主要挑戰。 一是連貫記憶是一種美妙的抽象,但在特殊情況下它開始崩潰。 因此,例如,NUMA 是一個活生生的例子,您可以在其中假裝統一內存存在。 實際上——不,表演會讓你哭。 在某些時候,架構師將不得不放棄統一內存架構的想法,你不能假裝永遠。 將需要新的編程模型,這些模型易於使用且功能強大以提高底層硬件的效率。 這是一個非常困難的妥協,因為如果你向程序員展示硬件中實際使用的架構,他們會發瘋的。 它太複雜而且不便攜。 如果你呈現的界面過於簡單,性能會很差。 因此,為了提供適用於真正大型多核處理器的有用編程模型,需要做出許多非常困難的妥協。 我不確定除了狹隘的專家以外的任何人都能夠在 2000 核計算機上編程。 除非你在做非常專業或科學的計算、密碼學或其他什麼,否則仍然不清楚如何正確地做。 

另一個類似的方向是專門的架構。 圖形加速器已經存在很長時間了,但已經成為一種典型的例子,說明如何進行特殊類型的計算並在專用芯片上運行它。 這增加了它自己的挑戰:你如何與這樣的設備通信,你如何編程。 我最近在外地工作 近內存計算. 你拿一個小處理器並將它粘到一個巨大的內存塊上,這樣內存就以 L1 緩存速度運行,然後它與像這樣的設備通信 TPU - 處理器正忙於將新任務加載到您的內存核心中。 為這類事情開發數據結構和通信協議是另一個有趣的例子。 因此,專用處理器和硬件將在相當長的一段時間內得到改進。

Alexey:關於非易失性存儲器(非易失性存儲器)?

莫里斯:哦,那是另一個很好的例子! NVM 將極大地改變我們看待數據結構等事物的方式。 從某種意義上說,非易失性存儲器有望真正加快速度。 但這不會讓生活變得更輕鬆,因為大多數處理器、高速緩存和寄存器仍然是易失性的。 當你在崩潰後重新啟動時,你的狀態和你的記憶狀態將不會與崩潰前完全相同。 我非常感謝參與 NVM 的人們——很長一段時間以來,研究人員都會有事可做,試圖找出正確性條件。 如果計算能夠在高速緩存和寄存器的內容丟失但主存儲器完好無損的崩潰中倖存下來,則計算是正確的。

編譯器與 CPU、RISC 與 CISC、共享內存與消息傳遞

Vladimir:您如何看待指令集方面的編譯器與處理器的困境? 為那些不在主題中的人解釋:如果我們去不均勻內存或類似的東西,我們可以應用一組非常簡單的指令並要求編譯器生成可以利用這些好處的複雜代碼。 或者我們可以走另一條路:實現複雜的指令並要求處理器重新排序指令並對它們進行其他操作。 你怎麼看待這件事?

莫里斯:我真的沒有這個問題的答案。 這場辯論已經持續了四年。 中間有一段時間 縮寫的 命令集和 難的 內戰是由一組團隊發動的。 有一段時間,RISC 人贏了,但後來英特爾重建了他們的引擎,以便在內部使用精簡的指令集,而將完整的指令集輸出到外部。 或許這是每個新一代都必須找到自己的妥協並做出自己的決定的話題。 很難預測這些事情中哪一個會變得更好。 所以我所做的任何預測都會在一定時間內為真,然後在一段時間內再次變為假,然後再次為真。

Alexey:對於整個行業來說,一些想法在幾十年內獲勝而在未來幾十年失敗的情況有多普遍? 還有其他這種週期性變化的例子嗎?

Maurice:在分佈式計算領域,有人相信 共享內存 和相信的人 訊息交換. 本來在分佈式計算中,並行計算就是消息傳遞。 然後有人發現共享內存使編程變得容易得多。 對方說共享內存太複雜了,因為它們需要鎖之類的東西,所以值得轉向那些只存在消息傳遞的語言。 有人看著它的結果說:“哇,這個消息傳遞實現看起來非常類似於共享內存,因為你創建了很多很多這樣的小模塊,它們互相發送消息,而且它們都 僵局, - 讓共享內存數據庫變得更好!”。 這一切一遍又一遍地重複著,不可能說哪一方是絕對正確的。 一方將永遠占主導地位,因為一旦其中一方幾乎獲勝,人們就會一次又一次地發明改進另一方的方法。

編寫脆弱的多線程代碼的藝術

阿列克謝:這很有趣。 比如我們在寫代碼的時候,不管是什麼編程語言,通常都要創建像單元格這樣的抽象,可以讀寫。 但實際上,在某些物理層面上,它可能看起來像是在不同計算機和其他設備之間的硬件總線上發送消息。 事實證明,同時在兩個抽象層次上都有工作。

Maurice:毫無疑問,共享內存是建立在消息傳遞之上的——總線、緩存等等。 但是使用消息傳遞很難編寫程序,所以硬件故意撒謊,假裝你有某種統一的內存。 這將使您在性能開始下降之前更容易編寫簡單、正確的程序。 然後你說:看來是時候和緩存交朋友了。 那就是你開始擔心緩存位置的時候,然後我們就走了。 從某種意義上說,您正在打破抽象:您知道它不僅僅是平坦的、統一的內存,而且您將使用這些知識來編寫對緩存友好的程序。 這是你在實際任務中必須做的。 給定的漂亮簡單漂亮的抽象與底層硬件極其複雜的實現之間的這種衝突是每個人都做出自己的妥協的地方。 我有一本關於多處理器和同步的書,有一天我打算在 java.util.並發. 如果你看他們,像 跳過列表 這些都是令人驚嘆的藝術作品。 (編者註:熟悉Java語言的人至少應該看一下實現 並發SkipListMap, 您可以查看以下鏈接 API и 源代碼). 但在我看來,將它們展示給學生是不負責任的,因為這樣的數據結構就像馬戲團裡的人,在熊坑上走鋼絲。 如果你改變哪怕是一個小細節,整個結構都會崩潰。 這段代碼非常快速和優雅,只是因為它寫得很完美,但稍有改動就會導致徹底失敗。 如果我把這段代碼作為例子給學生看,他們馬上就會說:我也可以! 然後一些飛機會墜毀或核反應堆會爆炸,我沒有在正確的時間向他們提供太多信息將是我的錯。

Alexey:當我還小的時候,我曾多次嘗試研究 Doug Lee 的源代碼,例如, java.util.並發,因為它是開源的,所以很容易找到它並嘗試了解那裡發生了什麼。 結果不是很好:通常,完全不清楚為什麼道格決定以這種方式做某事,而其他人都以不同的方式做事。 你如何向你的學生解釋這些事情? 例如,是否有一種特別正確的方法來描述硬核算法的具體細節? 你怎麼做呢?

莫里斯:繪畫老師有一句老話,他們最先記住的是:如果你想像畢加索那樣畫畫,你必須先學會如何畫簡單的寫實圖,只有當你知道規則時,你才能開始打破規則。 如果你立即開始違反規則,你就會陷入困境。 首先,我教學生如何在不擔心性能的情況下編寫簡單、正確的代碼。 我是說這裡潛伏著複雜的時序問題,所以不要擔心緩存,不要擔心內存模型,只要確保一切正常即可。 這已經夠難了:現代編程本身並不容易,尤其是對新生而言。 當他們對如何編寫正確的程序有直覺時,我說:看看這兩個自旋鎖實現:一個很慢,第二個也不是很好,但已經更好了。 然而,這兩種算法在數學上是相同的。 事實上,其中之一使用緩存局部性。 其中一個在本地緩存數據上旋轉,另一個通過總線重複執行操作。 如果你不理解它,如果你不知道如何打破抽象並查看底層結構,你就無法編寫高效的代碼。 但是您無法立即開始執行此操作。 有些人立即開始這樣做並相信自己的天才,通常結果很糟糕,因為他們不了解其中的原理。 沒有人像畢加索那樣畫畫,也沒有人像剛從大學畢業的道格·李 (Doug Lee) 在第一周就開始寫程序。 達到這種知識水平需要數年時間。

Alexey:原來你把問題分成兩部分:第一是正確性,第二是性能?

莫里斯:沒錯。 而且,按照這個順序。 部分問題是新生沒有意識到正確性很難實現。 他們乍一看說:這顯然是正確的,只是為了加快速度。 所以有時我告訴他們一個本質上不正確的算法,就好像它是正確的一樣。

如何教學生編寫複雜的多線程代碼

阿列克謝:只是為了看看他們是否能感應到詭計?

Maurice:我總是提前警告你,有時我會想出錯誤的算法。 你不應該欺騙別人。 我建議他們對這些信息持懷疑態度。 如果我說了些什麼然後說:“看,這顯然是正確的”——這是一個信號,表明他們在某個地方試圖欺騙你,你應該開始提問了。 接下來,我嘗試鼓勵學生不斷提問,然後提示:“如果我們讓一切保持原樣,會發生什麼?”。 他們立即看到錯誤。 但是讓學生相信他們需要擔心正確性比乍看起來要困難得多。 這些學生中有很多是在高中就開始編程的,有的已經找到工作並在那裡編程,他們都充滿了自信。 這是軍事上的事情:你首先必須扭轉他們的情緒,才能說服他們耐心地解決新出現的問題。 或者可能就像佛教僧侶:首先他們學會推理正確性,一旦他們了解推理正確性的方式,他們就可以進入下一個層次並開始擔心性能。

Alexey:也就是說,有時你會向學​​生展示無法工作的示例,由此你會得到反饋,表明他們是否理解問題的本質,是否能找到錯誤的代碼和錯誤的結果。 那麼,學生通常如何取悅或不高興?

莫里斯:幾乎總是學生最終會發現錯誤。 如果他們搜索得太慢,我會提出引導性問題,在這裡重要的是要了解,如果他們從未被欺騙,他們將開始不假思索地將您的話視為最終真理。 然後他們會感到無聊,並在課堂上用筆記本電腦閱讀 Facebook 時睡著了。 但是當你提前讓他們知道他們要被騙了,如果他們不覺悟就會顯得很愚蠢,他們就會變得更加警惕。 這在很多方面都是好的。 我希望學生不僅要質疑自己對問題的理解,還要質疑老師的權威。 這個想法是學生可以隨時舉手說:我認為你剛才說的是錯誤的。 它是一個重要的學習工具。 我不希望任何一個學生坐下來靜靜地想:這一切看起來完全是胡說八道,但是舉手太可怕了,而且他確實是教授,所以他說的都是真的。 因此,如果事先警告他們並非所講的一切都一定是真實的,他們就有動力更加註意材料。 我明確聲明舉手提問是可以的。 你的問題可能聽起來很愚蠢或天真,但這往往是最好的問題的來源。

阿列克謝:非常有趣。 通常人們有某種心理障礙,阻止他們向教授提問。 特別是如果房間裡有很多人,每個人都害怕討論你的愚蠢問題會佔用所有這些人的時間。 有什麼技巧可以解決這個問題嗎?

Maurice:我經常停下來問經典問題。 任何陳述是否正確,或者他們將如何解決正在討論的問題。 這是關鍵的一步,尤其是在會議開始時,人們甚至都不好意思說出哪怕是最小的事情。 你問學生一個問題,什麼都不說。 一片寂靜,每個人都有些緊張,緊張感越來越強,然後突然有人崩潰了,崩潰地說出了答案。 所以你展開了這個情況:保持沉默比回答更困難和不舒服! 這是一個標準的教學技巧。 世界上每一位老師都應該知道如何做到這一點。

Alexey:現在我們為這次採訪取了一個很棒的標題:“回答比保持沉默更容易。”

維塔利:讓我再問你一件事。 您正在研究拓撲證明。 你怎麼連這個都扯進來了,因為分佈式計算和拓撲是完全不同的東西!

莫里斯:那裡有一個隱藏的關係。 當我還是一名學生並學習數學時,我學習的是純數學。 直到我的學​​業結束,我才真正對計算機產生了興趣,我發現自己迫切需要找工作。 作為一名學生,我學習了代數拓撲。 許多年後,在解決一個名為 “k集協議問題”,我使用圖表對問題進行建模,然後看起來似乎找到了解決方案。 你只需要坐下來繞過伯爵。 嘗試在此圖上找到合適的答案。 但是我的算法不起作用:原來他總是在原地轉圈。 不幸的是,所有這些都無法用圖論的形式語言來解釋,這是所有計算機科學家都知道的語言。 然後我想起很多年前,甚至在拓撲課上,我們也使用過這個概念 “簡單複雜”,這是圖向更高維度的推廣。 然後我問自己:如果我們用單純复形重新表述問題會怎樣? 這成為了關鍵。 通過使用更強大的形式主義,問題突然變得簡單多了。 人們為此苦苦掙扎了很長時間,使用圖表,但他們無能為力。 甚至現在他們也做不到——正確的答案不是算法,而是解決問題不可能性的證明。 也就是說,這樣的算法根本不存在。 但 每一個不可能的證明 要么基於單純复形,要么基於人們假裝不考慮單純复形的事物。 從您用新名稱稱呼某物的事實來看,它並沒有失去其本質。

Vitaliy:原來你只是運氣好?

Maurice:除了運氣,還有 準備就緒. 意思是,你不應該忘記你以前學過的“無用”的東西。 你學到的無用的東西越多,你在面對新問題時就能提煉出越多的見解。 這種直觀的模式匹配很重要,因為……這麼說吧,它是一個鏈:一開始,我發現圖形不太行或根本行不通,這讓我想起了八年前的事情以及我們研究所有這些單純复形的學生時代。 反過來,這讓我找到了我的舊拓撲教科書並將其重新加載到我的腦海中。 但如果不是因為那些舊知識,我永遠不會在解決最初的問題上取得任何進展。

新版多處理器編程藝術

阿列克謝:你對你的書說了幾句話。 您撰寫了世界上最著名的多線程書籍可能不是最大的秘密, “多處理器編程的藝術”. 她已經11歲左右,從那時起才出來  修改重印. 會有第二版嗎?

莫里斯:你問得好! 很快,三個月左右。 還有兩位作者,我們添加了更多材料,改進了關於 fork / join 並行性的部分,寫了關於 MapReduce 的部分,添加了很多新東西並扔掉了不必要的東西 - 在撰寫本文時非常有趣的東西第一版,但今天已經不復存在了。 結果證明這是一本經過認真修訂的書。

阿列克謝:一切都已經完成,只剩下發布了嗎?

Maurice:還有幾章需要完善。 我們的出版商(我想他已經恨我們了)仍在試圖傳達我們應該更快地工作。 我們遠遠落後於計劃。 從理論上講,我們本可以早幾年完成這本書。

阿列克謝:有沒有機會在聖誕節前得到這本書的新版本?

莫里斯:那是我們的目標! 但是我已經多次預測勝利,以至於沒有人再相信我了。 在這件事上你可能也不應該太相信我。

阿列克謝:無論如何,這是個好消息。 我真的很喜歡這本書的第一版。 你可以說我是粉絲。

Maurice:希望新版對得起你們的熱情,謝謝!

事務性內存是如何發明的

Vitaly:下一個問題是關於事務內存的。 據我了解,你是這個領域的先驅,你在沒有人想過這些事情的時候發明了它。 你為什麼決定搬到這個地區? 為什麼交易對你很重要? 您是否認為有一天它們會體現在鐵中?

Maurice:我從研究生學習開始就了解交易。

Vitaliy:是的,但這些是不同的交易!

Maurice:我曾與 Elliott Moss 一起研究非阻塞垃圾收集。 我們的問題是我們想原子地改變內存中的幾個單詞,然後算法會變得非常簡單,至少其中一些會變得更有效率。 使用 比較和交換加載鏈接/存儲條件由並行架構提供,可以做一些事情,但它非常低效且醜陋,因為您必須處理間接級別。 我想改變內存字,我需要切換,因為我只能改變一個指針,所以他們需要指向某種類似目錄的結構。 我們討論瞭如果我們可以更改硬件以便它可以同時錄製該有多好。 Elliot 似乎已經註意到了這一點:如果您查看緩存一致性協議,它們已經提供了大部分所需的功能。 在樂觀事務中,緩存一致性協議會注意到時間衝突的存在,緩存將變為 空虛. 如果您推測性地在緩存上啟動事務並使用一致性協議的機制來檢測衝突,會發生什麼情況? 推測性的硬件架構很容易設計。 所以我們這樣寫 第一次出版 關於事務內存。 與此同時,我工作的公司 Digital Equipment Corporation 正在開發一款名為 Alpha 的新型 64 位處理器。 所以我去向 Alpha 開發團隊介紹了我們出色的事務性內存,他們問:如果我們將所有這些直接放入處理器中,我們公司會獲得什麼額外收入? 我對此完全沒有答案,因為我是一名技術專家,而不是營銷專家。 我真的無話可說。 他們對我什麼都不知道感到很不以為然。

維塔利:數十億! 就說“億”吧!

莫里斯:是的,那是我應該說的。 現在,在創業時代等等,我知道如何編寫商業計劃書。 您可以對潛在利潤的大小撒謊。 但在那個年代顯得幼稚,所以我只是說,“我不知道。” 如果您查看有關事務性內存的出版物歷史,您會注意到一年後有幾次引用它,然後大約十年沒有人引用這篇文章。 引用出現在 2004 年左右,當時真正的多核應運而生。 當人們發現編寫並行代碼可以賺錢時,新的研究開始了。 拉維·拉傑瓦爾 寫了一篇文章,它以某種方式向主流介紹了事務性內存的概念。 (編者註:本文於 2010 年發布了第二版,可免費獲取 作為PDF). 突然間,人們意識到這一切究竟是如何使用的,他們是如何用鎖來加速傳統算法的。 過去似乎只是一個有趣的學術問題的一個很好的例子。 是的,如果你當時問我是否認為這一切在未來很重要,我會說:當然,但具體什麼時候還不清楚。 也許50年後? 實際上,結果只有十年。 當你做某事時感覺非常好,而且在短短十年內人們就會注意到它。

為什麼值得在分佈式計算領域做研究

Vitaly:如果我們談論新的研究,您會給讀者什麼建議——分佈式計算還是多核,為什麼? 

Maurice:如今獲得多核處理器很容易,但建立真正的分佈式系統卻更難。 我開始研究它們是因為我想做一些與我的博士不同的事情。 這是我一直給初學者的建議:不要寫後續論文——嘗試朝著新的方向前進。 另外,多線程很容易。 我可以在筆記本電腦上運行我自己的 fork,而無需起床。 但是如果我突然想創建一個真正的分佈式系統,我將不得不做很多工作,吸引學生等等。 我是一個懶惰的人,更喜歡在多核上工作。 試驗多核系統也比試驗分佈式系統更容易,因為即使在一個愚蠢的分佈式系統中,也有太多的因素需要控制。

Vitaliy:你現在在做什麼,研究區塊鏈? 你應該首先關注哪些文章?

莫里斯:最近出現 很好的文章這是我和我的學生 Vikram Saraf 一起寫的,專門為 代幣經濟學會議 三週前在巴黎。 這是一篇關於有用的分佈式系統的文章,其中我們建議使以太坊成為多線程的。 現在智能合約(在區塊鏈上運行的代碼)是按順序執行的。 我們之前寫過一篇文章,談到了一種使用投機交易來加速這個過程的方法。 我們從軟件事務內存中吸取了很多想法,然後說如果你把這些想法變成 Etherium 虛擬機的一部分,那麼一切都會運行得更快。 但為此,合同中沒有數據衝突是必要的。 然後我們假設在現實生活中真的沒有這樣的衝突。 但我們還沒有機會知道。 然後我們想到我們手上有將近十年的真實合約歷史記錄,所以我們卸下以太坊區塊鏈並想知道:如果這些歷史記錄並行運行會怎樣? 我們發現速度有了顯著提高。 在以太坊的早期,速度提高了很多,但今天一切都變得更加複雜,因為合約更少,需要序列化的數據發生衝突的可能性變得更高。 但所有這些都是基於真實歷史數據的實驗性工作。 區塊鏈的好處是它會永遠記住一切,所以你可以回到過去研究如果我們使用其他算法運行代碼會發生什麼。 過去的人們會如何喜歡我們的新想法。 做這樣的研究要容易得多,也愉快得多,因為有一種東西在監視一切,記錄一切。 這已經更像是社會學而不是算法的開發。

算法的發展是否停止,如何生存

Vitaly:是時候回答最後一個理論問題了! 是否感覺競爭性數據結構的進步每年都在萎縮? 您認為我們對數據結構的理解是否已經達到了一個平台,或者會有一些重大改進? 也許有一些聰明的想法可以徹底改變一切?

Maurice:我們可能已經達到了傳統架構數據結構的穩定期。 但是新架構的數據結構仍然是一個非常有前途的領域。 如果您想為硬件加速器創建數據結構,那麼 GPU 數據結構與 CPU 數據結構非常不同。 當你為區塊鏈設計數據結構時,你需要對數據片段進行哈希處理,然後將它們放入類似 默克爾樹, 防止假冒。 最近這一領域的活動激增,許多都做得很好。 但我認為將會發生的是新架構和新應用程序將導致新的數據結構。 較舊的應用程序和傳統架構 - 也許不再有太多研究空間了。 但如果你走出人跡罕至的地方,看看邊緣,你會看到主流並沒有認真對待的瘋狂事物——那才是所有令人興奮的事情真正發生的地方。

Vitaly:因此,要成為一名非常有名的研究人員,我必鬚髮明自己的架構🙂

Maurice:你可以“竊取”別人的新架構——這看起來容易多了!

在布朗大學工作

Vitaliy:你能告訴我們更多關於 布朗大學你在哪工作? 在信息技術的背景下,對他知之甚少。 比麻省理工學院少,例如。

莫里斯:布朗大學是美國最古老的大學之一。 我覺得只有哈佛大一點。 布朗是所謂的一部分 常春藤聯盟,這是八所最古老大學的集合。 哈佛、布朗、康奈爾、耶魯、哥倫比亞、達特茅斯、賓夕法尼亞、普林斯頓。 這是一所古老的、小型的、有點貴族氣息的大學。 重點是文科教育。 它不是想像麻省理工學院,麻省理工學院非常專業和技術。 布朗大學是學習俄羅斯文學或古典希臘文學,當然還有計算機科學的好地方。 它側重於綜合教育。 我們的大多數學生都去 Facebook、Apple、Google,所以我認為我們的學生在這個行業找到工作沒有問題。 我去 Brown 工作是因為在那之前我在波士頓的 Digital Equipment Corporation 工作。 這是一家發明了很多有趣東西的公司,但卻否定了個人電腦的重要性。 一個命運多舛的公司,其創始人曾經是年輕的革命者,他們沒有學到任何東西,也沒有忘記任何東西,因此在大約十年內從革命者變成了反動者。 他們喜歡開玩笑說個人電腦屬於車庫——當然是廢棄的車庫。 很明顯,它們被更靈活的公司摧毀了。 當很明顯公司有麻煩時,我打電話給我在布朗的朋友,他距離波士頓大約一小時車程。 當時我並不想離開波士頓,因為其他大學的名額並不多。 那時候計算機科學領域的職位空缺不像現在那麼多。 布朗有一份工作,我不必搬出我的房子,我不必搬家,我真的很喜歡住在波士頓! 所以我決定去布朗。 我喜歡。 學生們很棒,所以我從來沒有嘗試去別的地方。 在休假期間,我在微軟工作了一年,去了海法的 Technion 一年,現在我將在 Algorand。 我到處都有很多同事,因此我們教室的實際位置並不是那麼重要。 但最重要的是學生,他們是這裡最好的。 我從來沒有嘗試去別的地方,因為我在這裡很開心。

然而,儘管布朗在美國享有盛譽,但他在海外卻出人意料地默默無聞。 如您所見,現在我正在盡最大努力糾正這種情況。

大學研究與企業研究的區別

Vitaliy:好的,下一個問題是關於數字設備的。 你是那裡的研究員。 在大公司的研發部門工作和在大學工作有什麼區別? 有什麼優點和缺點?

Maurice:我在 Microsoft 工作了 XNUMX 年,與 Sun Microsystems、Oracle、Facebook 和現在的 Algorand 的人密切合作。 基於這一切,我想說,無論是在公司還是在大學裡,都可以進行一流的研究。 重要的區別在於,在公司中,您與同事一起工作。 如果我突然對一個尚不存在的項目有了想法,我必須讓我的同行相信這是一個好主意。 如果我在布朗大學,那麼我可以對我的學生說:讓我們研究反重力吧! 他們要么去找別人,要么接手這個項目。 是的,我需要尋找資金,我需要寫一份撥款申請等等。 不管怎樣,總會有很多學生,你可以單方面做決定。 但是在大學裡,你很可能不會和你這個級別的人一起工作。 在工業研究領域,您首先必須讓所有人相信您的項目值得進行。 我不能向任何人訂購任何東西。 這兩種工作方式都很有價值,因為如果你正在做一些非常瘋狂的事情而你的同事很難說服,那麼說服研究生就更容易了——尤其是如果你付錢給他們的話。 如果你從事的工作需要大量經驗和深厚的專業知識,那麼你需要的同事可以說“不,我剛好了解這個領域,而你的想法很糟糕,不會有任何結果。” 這在浪費時間方面非常有用。 而且,如果在工業實驗室你花很多時間寫報告,那麼在大學你花時間找錢。 如果我希望學生能夠去某個地方旅行,我必須在其他地方找到錢。 而且你在大學裡的職位越重要,你用來收錢的時間就越多。 所以,現在你知道我的工作是什麼了——職業乞丐! 就像那些帶著布施盤四處走動的僧侶一樣。 總的來說,這兩項活動是相輔相成的。 這就是為什麼我試圖在兩個世界中堅定地生活和站穩腳跟。

Vitaliy:似乎說服一家公司比說服其他科學家更難。

莫里斯:更難,而且更難。 而且,在不同的領域是不同的:有人進行全面研究,有人專注於他們的主題。 如果我去微軟或 Facebook 說,讓我們做反重力,他們幾乎不會感激。 但是,如果我對我的研究生說完全相同的話,他們很可能會立即開始工作,儘管現在我已經遇到了問題——因為你需要為此找錢。 但是只要你想做符合公司目標的事情,那家公司就可以是一個非常好的做研究的地方。

九頭蛇和SPTDC

Vitaliy:我的問題即將結束,讓我們談談即將到來的俄羅斯之行。

莫里斯:是的,我很期待回到彼得堡。

Alexey:今年你能和我們在一起,我感到非常榮幸。 這是你第二次來聖彼得堡了吧?

莫里斯:已經是第三個了!

阿列克謝:明白了,但是 斯普頓發展中心 - 正好是第二個。 學校最後一次打電話的時間 史泰克,現在我們換了一個字母(C to D,Concurrent to Distributed)來強調今年有更多與分佈式計算相關的領域。 你能談談你在學校的演講嗎? 九頭蛇會議?

Maurice:在學校,我想談談區塊鏈的基礎知識以及你可以用它做什麼。 我想表明,區塊鏈與我們熟悉的多線程編程非常相似,但有它們自己的細微差別,了解這些差異很重要。 如果你在一個普通的網絡應用程序中犯了一個錯誤,那就太煩人了。 如果你在金融應用程序中編寫有錯誤的代碼,肯定有人會偷走你所有的錢。 這是完全不同層次的責任和後果。 我會稍微談談工作量證明、智能合約、不同區塊鏈之間的交易。

其他演講者將在我旁邊工作,他們也對區塊鏈有話要說,我們同意相互協調,以便我們的故事能夠很好地契合。 但是對於工程演講,我想向廣大聽眾解釋為什麼你不應該相信你聽到的關於區塊鏈的一切,為什麼區塊鍊是一個偉大的領域,它如何與其他眾所周知的想法相吻合,以及為什麼我們應該大膽展望未來。

Alexey:另外,我想說這不會像兩年前那樣以聚會或用戶組的形式進行。 我們決定在學校附近舉行一個小型會議。 原因是在與 Peter Kuznetsov 交談後,我們意識到學校僅限於 120 人,也許 XNUMX 人。 同時,有很多工程師想和你交談,參加報告,並且對這個話題普遍感興趣。 為此,我們創建了一個新的會議 稱為九頭蛇. 順便說一下,知道為什麼是 Hydra 嗎?

莫里斯:因為它有七個揚聲器? 他們可以被砍掉腦袋,新的演講者會代替他們長出來嗎?

Alexey:培養新演講者的好主意。 但實際上,這裡有一個故事。 還記得奧德修斯的傳說嗎,他必須在那裡航行 錫拉和卡呂布狄斯? 九頭蛇有點像卡律布狄斯。 故事是有一次我在一次會議上發言並談到了多線程。 本次會議只有兩條軌道。 在報告的開頭,我告訴大廳裡的聽眾,他們現在可以在錫拉和卡律布狄斯之間做出選擇。 我的精神動物是Charybdis,因為Charybdis有很多頭,我的主題是多線程。 這就是會議名稱的顯示方式。

無論如何,我們的問題和時間都用完了。 感謝朋友們接受精彩的採訪,我們在 SPTDC 和 Hydra 2019 見!

2019 年 11 月 12 日至 2019 日在聖彼得堡舉行的 Hydra XNUMX 會議上將有可能繼續與 Maurice 交流。 他會帶著報告來 «區塊鍊和分佈式計算的未來». 可以購買門票 在官方網站上.

來源: www.habr.com

添加評論