並列化


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