Windwaker wrote:
說穿了甚麼大學資開頭...(恕刪)


總比有人鬧了笑話還在嘴硬的好吧,我只有說你錯的部份,其它一概都沒說半句話。
更何況你把cron job當OS的scheduler這種笑話就知道你程度有點問題,且你嘴砲打起來連不相干的都扯的出來,最後變成鬼打牆。

針對你所說:
"你的軟體從來不用擔心要如何切Task分配給不同的平行Thread來給不同的核心"

讓你死心算了,以下程式請直接copy到visual c++ 編譯執行。每個網友都可以玩看看,多線程部份不論幾核(實體核心唷)全部滿載喔。哪一行指令有在擔心task怎麼分配給不同的平行thread來給不同的核心?

#include "stdafx.h"
#include <windows.h>
#include <ppl.h>
#include <iostream>

using namespace Concurrency;
using namespace std;
using namespace std::tr1;

template <class Function>
__int64 time_call(Function&& f)
{
__int64 begin = GetTickCount();
f();
return GetTickCount() - begin;
}

double** create_matrix(size_t size);

void destory_matrix(double** m, size_t size);

double** initialize_matrix(double** m, size_t size);

void matrix_multiply(double** m1, double** m2, double** result, size_t size)
{
for (size_t i = 0; i < size; 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;
}
}
}

//以下部份在做多線程
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;
}
});
}
// 多線程結束


int wmain()
{
const size_t size = 1750;

double** m1 = initialize_matrix(create_matrix(size), size);
double** m2 = initialize_matrix(create_matrix(size), size);
double** result = create_matrix(size);

cout << "現在進行single thread運算, 時間可能有點久,請稍待...." << endl;
cout << "耗用時間: " << time_call([&] {
matrix_multiply(m1, m2, result, size);
}) << " ticks"<<endl;

cout << "現在進行multithread運算...." << endl;
cout << "耗用時間: " << time_call([&] {
parallel_matrix_multiply(m1, m2, result, size);
}) << " ticks" << endl;

destory_matrix(m1, size);
destory_matrix(m2, size);
destory_matrix(result, size);
system("pause");
}

double** create_matrix(size_t size)
{
double** m = new double*[size];
for (size_t i = 0; i < size; ++i)
{
m[i] = new double[size];
}
return m;
}

void destory_matrix(double** m, size_t size)
{
for (size_t i = 0; i < size; ++i)
{
delete[] m[i];
}
delete m;
}

double** initialize_matrix(double** m, size_t size)
{
for (size_t i = 0; i < size; ++i)
{
for (size_t j = 0; j < size; ++j)
{
m[i][j] = static_cast<double>(rand());
}
}
return m;
}

公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
我還是善意提醒,不要全梭在TPL上頭.

你的解讀是不正確的.

TPL只是.NET 4 用來簡化平行運算的東西.
全梭在TPL上頭,真的會垮的.



網路討論不是賭上爺爺名譽的甚麼東東,
真的適可而止比較好.


"Multithreading Applications In Win32" 上的範例看過了嗎?

Windwaker wrote:


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


我很確定我寫過平行程式(雖然是小程式)

怎麼驗證呢? 用執行的時間來看

至於怎麼獲得執行的時間

可不是用語言內建的 clock count 或 gettime 之類來相減

唯一最準的當然是MSR_0x10


sambad wrote:
以下程式請直接copy到visual c++ 編譯執行。每個網友都可以玩看看,


請問VC 的版本用2005 pro 以後的 可以嗎?

yinhell wrote:
請問VC 的版本用2...(恕刪)


我沒用到奇怪的東西,你去試試使用win32主控台專案直接把程式碼貼進去即可,應該能動。但我使用2010版,其它版本還沒試就是了。
公喵不帥, 母喵不愛. 公喵愈壞, 母喵愈愛. 不帥的公喵想要母喵愛, 就只好學壞.
這一串文看下來,我這外行人也看懂了一些東西,某個人真是不知道在想什麼,板上這麼多有實戰經驗的資工前輩都點出關鍵了。

看得好累...
這篇爭論的焦點..老實說..到最後我已經看不太出來了..不過.大致可以了解是再爭議當程式多執行緒執行環境下..
到底支不支援多核心處理器運作..這個問題其實蠻籠統的..所以..雙方的爭議也一直找不到交集..
我想可以先就以下幾點理清楚後再來審視這個問題..或許會更清楚些

1.毫無疑問的在一般狀況下執行緒的分配是交由os決定的..程式(或用戶)本身根本無權調度
2.所謂平行運算.的兩大範疇指的是數據並行(SIMD)與指令並行.(Multi Therad).其中指令並行的狀況比較複雜
需考量到執行緒間進程與數據是否同步..所以需要一個通信的機制.通常會設立臨界區以防爭搶數據
3.Program:為一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。
4.Process:由Program所產生的執行個體,一個Program可以同時執行多次,並產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
A.一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,且彼此看不到對方的Memory Space。
B.一個以上的Thread。Thread包括從某個起始點開始,到目前為止所有函數的呼叫路徑,以及路徑上所用到的區域變數。程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。由此我們可以知道Therad 的組成元素為以下兩項:stack(即紀錄函數呼叫路徑,以及這些函數所用到的區域變數.)及cpu的狀態

由以上的解釋我們可簡單歸納出Thread的重點如下
1.一個Process可以有多個Thread。
2.同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
3.作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

接著我們回頭看爭論的問題焦點.當程式執行於多處理器的環境下,作業系統核心會藉由操縱調度器(Scheduler)對執行緒進行調度從而將執行緒映射到各個處理器上。這種調度方式一般不能滿足用戶自由安排分配任務的要求:通常需要作業系統提供一個用戶模式下的調度器來完成這個任務。調度器的任務就是儘可能合理的將任務分配和均衡到個處理器上。而在一般的情況下.作業系統會自動分配執行緒到某個核心(但並不限於單一核心)當前一執行緒執行完畢後才會執行下一執行緒..所以..其實雙方的觀念都不能說錯的離譜..只不過感覺起來w大稍稍鑽牛角尖了些..因為即使不支援多核運作的程式..在多核心處理器環境中由於能減少執行緒的變換次數..在效能上也會比單處理器的狀況下來的更好..而非全無幫助
這篇爭論的焦點..老實說..到最後我已經看不太出來了..不過.大致可以了解是再爭議當程式多執行緒執行環境下..
到底支不支援多核心處理器運作..這個問題其實蠻籠統的..所以..雙方的爭議也一直找不到交集..
我想可以先就以下幾點理清楚後再來審視這個問題..或許會更清楚些

1.毫無疑問的在一般狀況下執行緒的分配是交由os決定的..程式(或用戶)本身根本無權調度
2.所謂平行運算.的兩大範疇指的是數據並行(SIMD)與指令並行.(Multi Therad).其中指令並行的狀況比較複雜
需考量到執行緒間進程與數據是否同步..所以需要一個通信的機制.通常會設立臨界區以防爭搶數據
3.Program:為一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。
4.Process:由Program所產生的執行個體,一個Program可以同時執行多次,並產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
A.一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,且彼此看不到對方的Memory Space。
B.一個以上的Thread。Thread包括從某個起始點開始,到目前為止所有函數的呼叫路徑,以及路徑上所用到的區域變數。程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。由此我們可以知道Therad 的組成元素為以下兩項:stack(即紀錄函數呼叫路徑,以及這些函數所用到的區域變數.)及cpu的狀態

由以上的解釋我們可簡單歸納出Thread的重點如下
1.一個Process可以有多個Thread。
2.同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
3.作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

接著我們回頭看爭論的問題焦點.當程式執行於多處理器的環境下,作業系統核心會藉由操縱調度器(Scheduler)對執行緒進行調度從而將執行緒映射到各個處理器上。這種調度方式一般不能滿足用戶自由安排分配任務的要求:通常需要作業系統提供一個用戶模式下的調度器來完成這個任務。調度器的任務就是儘可能合理的將任務分配和均衡到個處理器上。而在一般的情況下.作業系統會自動分配執行緒到某個核心(但並不限於單一核心)當前一執行緒執行完畢後才會執行下一執行緒..所以..其實雙方的觀念都不能說錯的離譜..只不過感覺起來w大稍稍鑽牛角尖了些..因為即使不支援多核運作的程式..在多核心處理器環境中由於能減少執行緒的變換次數..在效能上也會比單處理器的狀況下來的更好..而非全無幫助
這篇爭論的焦點..老實說..到最後我已經看不太出來了..不過.大致可以了解是再爭議當程式多執行緒執行環境下..
到底支不支援多核心處理器運作..這個問題其實蠻籠統的..所以..雙方的爭議也一直找不到交集..
我想可以先就以下幾點理清楚後再來審視這個問題..或許會更清楚些

1.毫無疑問的在一般狀況下執行緒的分配是交由os決定的..程式(或用戶)本身根本無權調度
2.所謂平行運算.的兩大範疇指的是數據並行(SIMD)與指令並行.(Multi Therad).其中指令並行的狀況比較複雜
需考量到執行緒間進程與數據是否同步..所以需要一個通信的機制.通常會設立臨界區以防爭搶數據
3.Program:為一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。
4.Process:由Program所產生的執行個體,一個Program可以同時執行多次,並產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
A.一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,且彼此看不到對方的Memory Space。
B.一個以上的Thread。Thread包括從某個起始點開始,到目前為止所有函數的呼叫路徑,以及路徑上所用到的區域變數。程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。由此我們可以知道Therad 的組成元素為以下兩項:stack(即紀錄函數呼叫路徑,以及這些函數所用到的區域變數.)及cpu的狀態

由以上的解釋我們可簡單歸納出Thread的重點如下
1.一個Process可以有多個Thread。
2.同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
3.作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

接著我們回頭看爭論的問題焦點.當程式執行於多處理器的環境下,作業系統核心會藉由操縱調度器(Scheduler)對執行緒進行調度從而將執行緒映射到各個處理器上。這種調度方式一般不能滿足用戶自由安排分配任務的要求:通常需要作業系統提供一個用戶模式下的調度器來完成這個任務。調度器的任務就是儘可能合理的將任務分配和均衡到個處理器上。而在一般的情況下.作業系統會自動分配執行緒到某個核心(但並不限於單一核心)當前一執行緒執行完畢後才會執行下一執行緒..所以..其實雙方的觀念都不能說錯的離譜..只不過感覺起來w大稍稍鑽牛角尖了些..因為即使不支援多核運作的程式..在多核心處理器環境中由於能減少執行緒的變換次數..在效能上也會比單處理器的狀況下來的更好..而非全無幫助
這篇爭論的焦點..老實說..到最後我已經看不太出來了..不過.大致可以了解是再爭議當程式多執行緒執行環境下..
到底支不支援多核心處理器運作..這個問題其實蠻籠統的..所以..雙方的爭議也一直找不到交集..
我想可以先就以下幾點理清楚後再來審視這個問題..或許會更清楚些

1.毫無疑問的在一般狀況下執行緒的分配是交由os決定的..程式(或用戶)本身根本無權調度
2.所謂平行運算.的兩大範疇指的是數據並行(SIMD)與指令並行.(Multi Therad).其中指令並行的狀況比較複雜
需考量到執行緒間進程與數據是否同步..所以需要一個通信的機制.通常會設立臨界區以防爭搶數據
3.Program:為一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。
4.Process:由Program所產生的執行個體,一個Program可以同時執行多次,並產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
A.一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,且彼此看不到對方的Memory Space。
B.一個以上的Thread。Thread包括從某個起始點開始,到目前為止所有函數的呼叫路徑,以及路徑上所用到的區域變數。程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。由此我們可以知道Therad 的組成元素為以下兩項:stack(即紀錄函數呼叫路徑,以及這些函數所用到的區域變數.)及cpu的狀態

由以上的解釋我們可簡單歸納出Thread的重點如下
1.一個Process可以有多個Thread。
2.同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
3.作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

接著我們回頭看爭論的問題焦點.當程式執行於多處理器的環境下,作業系統核心會藉由操縱調度器(Scheduler)對執行緒進行調度從而將執行緒映射到各個處理器上。這種調度方式一般不能滿足用戶自由安排分配任務的要求:通常需要作業系統提供一個用戶模式下的調度器來完成這個任務。調度器的任務就是儘可能合理的將任務分配和均衡到個處理器上。而在一般的情況下.作業系統會自動分配執行緒到某個核心(但並不限於單一核心)當前一執行緒執行完畢後才會執行下一執行緒..所以..其實雙方的觀念都不能說錯的離譜..只不過感覺起來w大稍稍鑽牛角尖了些..因為即使不支援多核運作的程式..在多核心處理器環境中由於能減少執行緒的變換次數..在效能上也會比單處理器的狀況下來的更好..而非全無幫助..不知這樣說明是否清楚些
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 72)

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