並列化
POINT
何を並列にすべきか考える
[.] Data を並列にわけて処理をする
[.] 全体の処理を 小さな処理にわけて処理をする
といったように 分ける対象の選ぶところから始まる
Data.の並列化
SAMPLE
https://www.dropbox.com/s/p5ag5o088sxdm6r/thread_covert_image.exe( 画像変換の並列処理 )
DESC
処理する対象データを 小分けして処理を並列にする
画像のピクセル単位の処理が分りやすい例。
各ピクセルデータ間には依存関係がないため並列して処理ができる。
// 画像をモノクロに変換する
void funcTrd( void *ptr )
{
Data *w = (Data *)ptr;
u32 i;
unsigned char y;
/*
WARNING
1. unsigned でないと問題あり.
char *p = 0000 = 255 = 0x00010000
*/
unsigned char *p = (unsigned char *)(w->data);
//char *p = (char *)(w->data);
for( i=0; i<w->nr; i++ ){
y = 0.299f * (int)(p[2])
+ 0.587f * (int)(p[1])
+ 0.114f * (int)(p[0]);
p[0] = p[1] = p[2] = y;
p += sizeof(char) * 4;
}
}
int main( void )
{
s32 i, nr;
HANDLE trd[NRTRD];
Data w[NRTRD];
image_w img;
// 画像の読み込み
loadBmp( "test.bmp", &img );
nr = ( (img.w * img.h ) + (NRTRD - 1) ) / NRTRD;
for( i=0; i<NRTRD; i++ ){
w[i].id = i;
w[i].nr = nr;
w[i].data = ( (char*)(img.data)
+ i*nr*(sizeof(char)*4)
);
// 残り Pixel の調整
if ( i == NRTRD - 1) {
w[i].nr = (img.w * img.h) - nr*(NRTRD-1);
}
// Thread を作成して小分けしたデータを渡す
trd[i] = CreateThread( 0, 0,
(LPTHREAD_START_ROUTINE)funcTrd,
&(w[i]), 0, 0 );
}
WaitForMultipleObjects( NRTRD, trd, 1, INFINITE );
/* 画像の出力 */
writeBmp("test_mono.bmp", &img );
return 0;
}