Windwaker wrote:

程式根本看不到底部的硬體所以不會拒絕執行
對程式來說他不知道有幾個核心


光讀CPUID 可以獲得很多資訊

要知道環境並不是很困難的事...
yinhell wrote:
光讀CPUID 可以獲得很多資訊

要知道環境並不是很困難的事...


不困難,但程式設計師通常不會做....

想想看,你的程式線程要靠讀CPUID來隨機改變
不但很難寫【光是平行線程的數量就要自己調整】
平行線程已經夠麻煩了,還要靠自己調整數量
聽起來應該不是普通的痛苦

應該沒人那麼瘋狂吧....
Windwaker wrote:
這也就是支援八核心的程式
放在四核心,三核心,二核心都是一樣可以跑的
但是支援四核心的程式
到八核心上面就只能用到四核.(恕刪)


如果把這句話改成"到八核心上面就只能用到相當於四核的效果"會不會更好?
假定OS排程器把thread均勻的灑在八核心,只是thread相依性,相互Idle等待結果,只達成50%的利用率,有沒有發生的可能呢?
若有,如何一口咬定thread只會被標定的四核心上執行,其餘的四核心一定在旁邊發呆睡覺,置身事外呢?

如果把八核心Task Manager出現八個50%的CPU,相當於四核心的效果.
是不是該懷疑OS排程器真的把thread均勻的灑在八核心上,只是效果不彰,平均表現出四核而已.
這不就代表四核的Multi-thread真的支援八核心,但效果等於沒增加罷了.

"不支援" 的定義是等價的處理效果沒增加,還是沒使用到該處理核心,在整個討論串一直有模糊地帶,真是個災難!

(單thread對雙核處理器例子是不是同理可證呢?)
Windwaker wrote:
OS處理的是硬體資源的排程分配
但是把工作切個多少個核心
也就是平行Thread的數量來支援的核心數量
這部分是程式決定
...(恕刪)

這是基本中的基本,不用特別一直跳針重述,不妨專注在證明你提出的有爭議命題即可。

關於給你.NET Framework的說明,你沒有看懂,舉個例子給你,如果用Virtual Box裝了一個Guest VM,從Guest VM裡去看,"系統"主記憶體有3GB,顯示卡是(虛擬出的)S3 Trio 64,那請問可以因此斷定那台實體電腦,就是插了實體3GB的記憶體、顯示卡就是Trio 64嗎?

再重述一次,要直接看Native code那層!

Windwaker wrote:
也是你所謂的Task Manager的多Thread的程式
但是他明明就不支援多核啊?

因為這七個線程
這就是Sequential Thread啊
所以專案的七位成員只有一個能執行啊
所有七位成員都屬於Sp2004的Process只能用到一個核的效能(無法超過50%)

所以你現在能不能了解
為什麼支援N個數量多核心

需要N個數量的平行線程啊
...(恕刪)

不對,證明的邏輯性就有問題:

如果你可以因為觀察單一程式的表象,在沒有系統log佐證的情況下就證明你的特殊命題,那你也把命題"證明"這件事想得太容易、太輕率了,這樣證明,指導教授不可能會讓畢業的....

舉例來說:費馬最後定理 X^n+Y^n=Z^n,在n>2的情況下沒有整數解,請問你可以用(x=1, Y=2, Z=3, n=4) 代入驗算,然後因為驗算不成立,就大聲宣布已證明費馬最後定理嗎?

再提示一次:要證明你的命題,最一搶斃命的方式就是舉出Windows thread排程器的排程邏輯,如果你的命題成立,這麼重要的排程邏輯,不可能你這幾天猛力Google,卻找不到相關資料(其實就是因為Windows排程器不是這麼設計的),還找到Task Scheduler這個專門進行如星期一重組、星期二備份...等管家工作的工作排程器身上去、兼把異質性核心處理器扯出來,鬧了一堆笑話......

Windwaker wrote:

不是平行Thread就是Sequetial Thread啊
http://msdn.microsoft.com/en-us/library/dd537608.aspx

' Sequential version
For Each item In sourceCollection
Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))




其實這個地方可能根本不是這樣解讀....

For Each item In sourceCollection
Process(item)
Next

表示新增到 thread queue 的順序是傳統的循序方式,
就是T1,T2,T3,........Tn 這樣的順序.
當然排程後,按FIFO 原則,結果也大致上同樣順序.




Parallel.ForEach(sourceCollection, Sub(item) Process(item))

這個則是新增到 thread queue 的順序是無序(平行)的(可能有序,可能隨機,但順序不一定為循序,看演算法而定),
可能是 Tn,T10,T1,T8,Tn-6,..... (每次執行皆不同)
當然排程後,按FIFO 原則,結果大致上也會是 Tn,T10,T1,T8,Tn-6,..... (每次執行皆不同)的順序.




並非用來說明會使用到幾個cpu 核心的情況.




如果翻到後面的這篇: 說明Parallel.ForEach()該怎麼ForEach的時候,
http://msdn.microsoft.com/en-us/library/dd460720.aspx

或是說明甚麼叫TPL這篇:
http://msdn.microsoft.com/en-us/library/dd460717.aspx


就會發現好像與某人引的意思不太一樣.
umts wrote:
如果把這句話改成"到八核心上面就只能用到相當於四核的效果"會不會更好?
假定OS排程器把thread均勻的灑在八核心,只是thread相依性,相互Idle等待結果,只達成50%的利用率,有沒有發生的可能呢?若有,如何一口咬定thread只會被標定的四核心上執行,其餘的四核心一定在旁邊發呆睡覺,置身事外呢?


不可能會發生

Sp2004的例子已經很清楚
你有幾個平行Thread,OS才有辦法分配這些Thread到不同的核心
Sp2004有7個Threads但是都是Sequential Thread
所以倒頭來所有的Thread都會在同一個核心上面直行
因為這些Thread有相依性

所以今天你的程式有四個平行Threads
OS最多把這四個平行Thread放在最閒置的四核心上面
八核其他的四核心上面根本分不到平行的Thread
當然只好置身事外

umts wrote:
"不支援" 的定義是等價的處理效果沒增加,還是沒使用到該處理核心,在整個討論串一直有模糊地帶,真是個災難!


從頭到尾不支援的定義就是沒用到該處理器額外的核心
比如說單核程式無法利用到雙核多出來的資源
syntech wrote:

Parallel.ForEach(sourceCollection, Sub(item) Process(item))

這個則是新增到 thread queue 的順序是無序(平行)的(可能有序,可能隨機,但順序不一定為循序,看演算法而定),
可能是 Tn,T10,T1,T8,Tn-6,..... (每次執行皆不同)
當然排程後,按FIFO 原則,結果大致上也會是 Tn,T10,T1,T8,Tn-6,..... (每次執行皆不同)的順序.

並非用來說明會使用到幾個cpu 核心的情況.

http://msdn.microsoft.com/en-us/library/dd537608.aspx

同一頁有解釋Parrellel Thread的TPL會怎麼做

When a parallel loop runs, the TPL partitions the data source so that the loop can operate on multiple parts concurrently. Behind the scenes, the Task Scheduler partitions the task based on system resources and workload. When possible, the scheduler redistributes work among multiple threads and processors if the workload becomes unbalanced.

編譯器做的直接會切割資料的部分,才能同一時間把這些Threads給Multiple core
這又是平行運算的定義

平性運算的重點是〝同時〞,也是唯一運用多核的方法

如果都是Sequential Thread
同一時間擁有只能使用一個Core....比如說前面SP2004的例子
因為一次只能跑一個Thread

所以你有幾個平行Thread
才能充分利用同樣數量的核心
因為只有平行thread才能〝同時〞被CPU執行
ycweng wrote:
再提示一次:要證明你的命題,最一搶斃命的方式就是舉出Windows thread排程器的排程邏輯,如果你的命題成立,這麼重要的排程邏輯,不可能你這幾天猛力Google,卻找不到相關資料,還找到Task Scheduler這個專門進行如星期一重組、星期二備份...等管家工作的工作排程器身上去、兼把異質性核心處理器扯出來......


說真的,我最大的錯誤示太高估這個版上的人對平行運算的認識
寫到這邊我幾乎確定從那個大學教授到你這個業界人士
沒有一個寫過支援多核心的程式
所以才會在小地方一直轉圈圈

http://msdn.microsoft.com/en-us/library/ms682105(v=VS.85).aspx
Windows Thread的排程邏輯就在這邊
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.

http://msdn.microsoft.com/en-us/library/ms684251(v=VS.85).aspx
In an SMP computer, two or more identical processors or cores connect to a single shared main memory. Under the SMP model, any thread can be assigned to any processor. Therefore, scheduling threads on an SMP computer is similar to scheduling threads on a computer with a single processor. However, the scheduler has a pool of processors, so that it can schedule threads to run concurrently. Scheduling is still determined by thread priority, but it can be influenced by setting thread affinity and thread ideal processor, as discussed in this topic.

對Windows來說
他只是把不同的平行Thread最高的Priority分配到最閒置的核心來同時進行

今天你的程式如同SP2004只有七個Sequential Thread
雖然號稱Multi-thread
對Windows Scheduler來說就會丟到一個核心上面
原因很簡單,因為Sequential Thread根本不能同時執行
還是大師要告訴我Sequential Thread可以同時在不同核心執行的秘訣?

只有平行的thread才能讓Windows Scheduler有機會同時在不同的核心執行
這樣理解為什麼Multi-thread不是支援多核心的保證嗎?
物件導向被我當掉的學生都說他寫過C++,即便他們程度可以輕鬆滅掉一般私校生,不及格依舊是不及格。

說破了嘴,某人鬧的那兩個天大的笑話,依舊是天大的笑話。
公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
說穿了甚麼大學資開頭的教授
也是嘴砲為主
連平行線程是甚麼都搞不清楚
你的軟體從來不用擔心要如何切Task分配給不同的平行Thread來給不同的核心
只期望OS幫你自動搞定
講的出Switch的程式邏輯就可以支援多核的線程
真才是天大的笑話啊

連誰是笑話都搞不清楚
也難怪台灣沒有上的了台面的軟體公司.....
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 72)

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