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;
}