sambad wrote:
//以下部份在做多線程
void parallel_matrix_multiply(double** m1, double** m2, double** result, size_t size)
{
parallel_for (size_t(0), size, [&](size_t i)
{
for (size_t j = 0; j < size; j++)
{
double temp = 0;
for (int k = 0; k < size; k++)
{
temp += m1[i][k] * m2[k][j];
}
result[i][j] = temp;
}
});
}
// 多線程結束



你只不過拿一個For_loop的library function來魚目混珠
你寫程式不管平行線程,不代表程式本身不管

這個整個程式串你從這邊轉貼來的吧
http://msdn.microsoft.com/en-us/library/dd728073.aspx
諷刺的就是這個就是Parallel Patterns Library

基本上這整個程式就是由Library把當中的for loop計算分成多個平行線程
這邊甚至有很清楚的說Library怎麼分配這些平行線程
http://msdn.microsoft.com/en-us/library/dd470426.aspx

The parallel_for algorithm partitions tasks in an optimum way for parallel execution. It uses a work-stealing algorithm to balance these partitions when workloads are unbalanced. When one loop iteration blocks cooperatively, the runtime redistributes the range of iterations that is assigned to the current thread to other threads or processors. Similarly, when a thread completes a range of iterations, the runtime redistributes work from other threads to that thread. The parallel_for algorithm also supports nested parallelism. When one parallel loop contains another parallel loop, the runtime coordinates processing resources between the loop bodies in an efficient way for parallel execution.

看到紅字的地方嗎

不是你不用考慮平行線程
而是Library幫你做好了
所以到頭來程式本身還是要自己處理怎麼平行這些線程

以程式設計師的角度來說,寫For Loop平行化可以丟給Parrellel Library
Library只不過是MS微軟寫好了給你
但是程式本身還是需要自己分散平行線程
這個部分不是OS處理的

像是3D繪圖這部分沒有這麼方便
只要寫個For Loop用用現有的Library
可沒有一個大Library直接讓你可以直接平行化所有的3D繪圖
才會有很多情況下遊戲只支援雙核而不是四核

教授,你現在知道平行線程要是程式本身自己去考慮多核的應用
而不是靠OS了吧
cupidchen wrote:
調度器的任務就是儘可能合理的將任務分配和均衡到個處理器上。而在一般的情況下.作業系統會自動分配執行緒到某個核心(但並不限於單一核心)當前一執行緒執行完畢後才會執行下一執行緒..所以..其實雙方的觀念都不能說錯的離譜..只不過感覺起來w大稍稍鑽牛角尖了些..因為即使不支援多核運作的程式..在多核心處理器環境中由於能減少執行緒的變換次數..在效能上也會比單處理器的狀況下來的更好..而非全無幫助..不知這樣說明是否清楚些



我們講的是單一程式

大部分的人搞不清楚的乃是Sequential和Parrellel Thread的差別
在傳統單核的環境裡面
所有的程式寫成Sequential就足夠了
【這同時也是大部分程式的寫法】
因為多個Thread只要不斷藉由OS排程到CPU核心
不會有兩個thread被同時執行
這雖然是多線程但是不支援多核
Sp2004前面的例子已經舉過

當硬體的核心大於一個的時候
程式最大的挑戰是〝如何同一時間執行兩個以上的Thread〞
因為OS的立場只是不斷分配Thread到空閒的核心上
程式需要把Task切成平行Thread才能讓多個Thread同一時間讓多核執行

現在的問題是,這板上跟寫大型平行程式的人根本沒有
才會有業界人士YcWeng說只要多線程必定支援多核心
【殊不知道支援多核心的關鍵是平行線程數,因為同一程式Sequential thread不管有多少是不能被多核同時執行】
還有大學教授sambad說程式不用自己分散Task平行來支援多核心
【殊不知道他用了平行運算的程式庫,程式自己會平行他卻不知】

從頭到尾就是因為OS只是支援多核的硬體資源分配
是沒辦法讓單一軟體支援多核的
這就是為什麼你會看到某某軟體只支援雙核,或是只支援到四核

要怎麼分配軟體負載到這些多核的硬體上
這要靠程式自己有足夠的平行thread來分配到同樣數量的核心數
也就是說SC2繪圖只有兩個平行Threads
所以超頻之後到三核效能沒幾乎增長
因為沒有足夠的平行thread分給第三個Core
一個程式要支援BD的八核心
一定要有八個平行Threads這對很多程式都是挑戰
通常寧願有比較快的四個核心
這也就是最大的原因BD/X6/i7都有所謂的Turbo Core功能

這樣清楚了嗎?
Windwaker wrote:
你只不過拿一個For...(恕刪)


本人就是針對你說""你的軟體從來不用擔心要如何切Task分配給不同的平行Thread來給不同的核心"來回答。
許多合適的問題(如矩陣運算)天生就適合平行處理,所以使用一行parallel_for就可以立即變成多執行緒。
事實上就是一行指令讓多核滿載,請問寫程式的程式員要擔心什麼?
我清楚的用大家都看的懂的例子回答了你的問題,
所以還要再轉來轉去鬼打牆我也沒有辦法。
我就是知道它會平行處理才舉例子,所以不是你說的"程式自己會平行而不自知"。我要強調的是,合適的問題以現在的發展工具,不必太花腦筋也可以做到平行化,程式員根本不需要花太多精神就可以輕鬆搞定。

你要說嘴的話,請問,我提出程式的那篇裡面,哪一句東西說錯了?
有本事你找出來我那篇裡面哪句話錯了?不要用你的想像力去猜東猜西,我哪一句話寫錯了哇?
我清楚的說明了我在那一樓裡面要表達的東西,針對合適的問題"我不擔心如何切Task分配給不同的平行thread"。難不成我舉的程式例子證明"我擔心"嗎?
再來請提出來我寫的部份,我在哪一篇的那一行寫錯了?
不要給我用想像的說我怎麼樣,我連寫誰鬧的是笑話都有寫對耶。

多緒不必把他變成你嘴上那種要讓程式員想破頭的東西,
我引用的程式例子寫很清楚,合適的東西一行指令就可以變成有效率的多緒。

你其實蠻多東西都有說對,但最後常常又摻進錯的,然後拿出來嘲笑別人的東西卻是錯的離譜。
所以,說破嘴,我在說你鬧的笑話依舊是天大笑話。
然後又可以把人家說的東西再冠上你自己的說法來解釋,的確會讓許多網友看不下去。
公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
sambad wrote:
本人就是針對你說""你的軟體從來不用擔心要如何切Task分配給不同的平行Thread來給不同的核心"來回答。
許多合適的問題(如矩陣運算)天生就適合平行處理,所以使用一行parallel_for就可以立即變成多執行緒。


教授自打嘴巴下不了台了對吧
Parrellel_for只不過是微軟寫好的Parrellel Library Function

問題:你的軟體需不需要擔心如何切Task分配給不同的平行Thread?
答案:不管你單不擔心,你的程式絕對需要擔心的切Task給不同的平行Thread,不然你就不會用微軟平行運算的Library了


sambad wrote:
合適的問題以現在的發展工具,不必太花腦筋也可以做到平行化,程式員根本不需要花太多精神就可以輕鬆搞定。


哪請問其他運算像3D運算沒有可用的微軟平行Library哩?
要知道大部分的大型複雜程式中
很多平行運算要自己寫的,可是沒有TPL用的
不然Sc2怎麼會只支援雙核哩

我們爭的簡單就是支援多核心到底看OS還是程式自己
現在你自己用Library Function就知道是靠程式自己來支援多核心運算

誰對誰錯應該很清楚
用不著牽拖其他的東西

最後請教教授Switch和支援多核平行運算有甚麼大關係啊

sambad wrote:
至於multithread programming,早些時後大家急就章的弄,雙核最佳化最好寫,所以才會變成這種怪樣。
它的做法就好像寫程式時,原本就用if(), if()...到底(單核的想法),後來一看有雙核就改成if..else.., if..else..的寫法(雙核想事情的方式),但到多核心時,你想事情的方式就一定要想成switch..case 1..case 2....case n。


平行的線程如果是同時進行的話
怎麼會用到Sequential Thread裡面的Switch和If哩?

平行應該是想如何把Task分成很多Thread
而不是用這種一步一步的Switch Case 1, Case2對吧?
還是教授對Switch command在平行運算有特別的見解?
找 Microsoft® Windows® Internals 4th/5th Edition
Processes, Threads, and Jobs 整章,
或是 最少看一下 Thread Scheduling 這節

syntech wrote:
找 Microsof...(恕刪)


前面貼過了
http://msdn.microsoft.com/en-us/library/ms682105(v=VS.85).aspx
1.Save the context of the thread that just finished executing.
2.Place the thread that just finished executing at the end of the queue for its priority.
3.Find the highest priority queue that contains ready threads.
4.Remove the thread at the head of the queue, load its context, and execute it.

對OS來說,只不過把不相關的Thread放在不同的核心上面
但是程式給OS平行的Thread才能讓多個核心同時執行
要提醒的是,並非這麼簡單.


你說的不是 100% 全錯,而是在重要關鍵的點上是錯的.
syntech wrote:
你說的不是 100% 全錯,而是在重要關鍵的點上是錯的.


還懇請大師指出重要的關鍵在哪邊
發現有人做了實驗:依序是這樣:

http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/02/multicore-1.aspx

http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/03/multicore-2.aspx

http://blog.darkthread.net/blogs/darkthreadtw/archive/2010/01/22/multicore-3.aspx


在 .NET 4 上對 平行運算做的實驗
應該對繼續打仗很有幫助.
希望大家各取所需
syntech wrote:
發現有人做了實驗:依...(恕刪)


說穿了你也搞不清楚發生甚麼事情

微軟TPL開頭就講的很清楚了
http://msdn.microsoft.com/en-us/library/dd460717%28VS.100%29.aspx

However, not all code is suitable for parallelization; for example, if a loop performs only a small amount of work on each iteration, or it doesn't run for many iterations, then the overhead of parallelization can cause the code to run more slowly.

重點是你的Load要夠大
才有必要平行化增加效能
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 72)

今日熱門文章 網友點擊推薦!