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了吧