
| 
\n | [ トップページ ] [ ____CommandPrompt ]
[ ____JScript ]
[ ____MySQL ]
[ ____Cygwin ]
[ ____Java ]
[ ____Emacs ]
[ ____Make ]
[ ____Perl ]
[ ____Python ]
[ ____OpenGL ]
[ ____C# ]
[ ____StyleSheet ]
[ ____C++ ]
[ ____Winsock ]
[ ____Thread ]
[ ____VisualStudio ]
[ ____C ]
[ ____Win32API ]
[ ____Lua ]
[ ____PhotoShop ]
 ヘッダ検索
 
 ■ 並列化
  POINT
    何を並列にすべきか考える
    
■ Data.の並列化SAMPLE
     画像変換の並列処理 
  DESC
    処理する対象データを 小分けして処理を並列にする
    画像のピクセル単位の処理が分りやすい例。
    各ピクセルデータ間には依存関係がないため並列して処理ができる。
    // 画像をモノクロに変換する
    
    void funcTrd( void *ptr )
    {
        Data *w = (Data *)ptr;
        unsigned int 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 )
    {
      int 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;
    }
 | 
 
 
 
 
 金利比較.COM
 | 
  
NINJAIDX 14