2014-03-02 58 views
0

所以,我給了一個程序在C++中,我必須使用TBB並行化(使其更快)。當我查看代碼時,我認爲使用管道是有道理的。問題是我沒有什麼經驗,我在網上發現的任何東西都讓我更加困惑。這裏是代碼的主要部分:並行視頻轉換程序tbb

uint64_t cbRaw=uint64_t(w)*h*bits/8; 
    std::vector<uint64_t> raw(cbRaw/8); 

    std::vector<uint32_t> pixels(w*h); 

    while(1){ 
     if(!read_blob(STDIN_FILENO, cbRaw, &raw[0])) 
      break; // No more images 
     unpack_blob(w, h, bits, &raw[0], &pixels[0]);  

     process(levels, w, h, bits, pixels); 
     //invert(levels, w, h, bits, pixels); 

     pack_blob(w, h, bits, &pixels[0], &raw[0]); 
     write_blob(STDOUT_FILENO, cbRaw, &raw[0]); 
    } 

它實際上讀取視頻文件,拆包,適用改造,包裝,然後將它寫入到輸出。這看起來很簡單,所以如果你有任何想法或資源可能有用,請分享。

Thanx提前,

D.基督。

回答

1

事實上,您可以使用tbb::parallel_pipeline並行處理多個視頻「blob」。

的基本方案是3級流水線:輸入濾波器讀取斑點,中間濾波器進行處理,並且最後一個經處理的團塊寫入到文件中。輸入和輸出過濾器應該是serial_in_order,中間過濾器可以是parallel。看起來可能會在中間階段(我會以此爲開始,儘量減少串行階段的工作量)或在輸出階段(但可能會更慢)進行拆包和打包。

您還需要確保數據存儲(您的案例中的rawpixels)不會在併發處理的斑點之間共享。也許最簡單的方法是通過管道傳輸每個blob存儲。與串行程序不同,對於需要在流水線階段之間傳遞的存儲使用自動變量是不可能的;因此,您需要在輸入過濾器中分配存儲空間new,並通過管道將其通過引用(或通過指針)傳遞,然後在輸出過濾器中完成所有處理後輸入delete。這對於raw存儲肯定是必要的。但是,對於pixels,如果所有需要它的操作(即拆包,處理和打包結果)都在中間過濾器的主體內完成,則可以繼續使用自動變量。當然,變量的聲明也應該在那裏移動。

我來簡單介紹一下你的串行代碼的修改,使它更適合應用parallel_pipeline。請注意,我將raw更改爲動態分配的數組,而不是std::vector;你顯示的代碼看起來並沒有將它用作矢量。請注意,這只是一個草圖,它可能不會按原樣工作。

uint64_t cbRaw=uint64_t(w)*h*bits/8; 
uint64_t * raw; // now a pointer to a dynamically allocated array 

while(1){ 
    { // The input stage 
     raw = new uint64_t[cbRaw/8]; 
     if(!read_blob(STDIN_FILENO, cbRaw, raw)) { 
      delete[] raw; 
      break; // No more images 
     } 
    } 
    { // The second stage 
     std::vector<uint32_t> pixels(w*h); 
     unpack_blob(w, h, bits, raw, &pixels[0]);  
     process(levels, w, h, bits, pixels); 
     //invert(levels, w, h, bits, pixels); 
     pack_blob(w, h, bits, &pixels[0], raw); 
    } 
    { // The output stage 
     write_blob(STDOUT_FILENO, cbRaw, raw); 
     delete[] raw; 
    } 
} 

TBB文檔中的流水線上有a tutorial。嘗試將您的代碼與此處的示例進行匹配;它應該很容易做到。您也可以在the TBB forum尋求幫助。

+0

從概念上說,我明白了。問題在於它在教程中使用了TextSlice *類型以便在流水線階段之間傳輸數據。它看起來非常複雜 – user3371706

+0

我已經更新了答案,以解釋您可能需要做的數據傳輸。希望有所幫助。 –