2014-04-16 80 views
0

如果我只想並行化循環並使用openmp連續保存到文件,什麼是最佳解決方案?我有一個包含大量信息的文件,我想將它們拆分成相同的塊(每個16個字節),並使用openmp(C++中的多線程編程)進行加密。加密過程完成後,這些塊存儲在一個文件中,但是與原始文件的序列相同。多線程在C++中使用openmp

i_count=meta->subchunk2_size-meta->subchunk2_size%16;// TO GET THE EXACT LENTH MODE 16 
    // Get the number of processors in this system 
     int iCPU = omp_get_num_procs(); 
     // Now set the number of threads 
     omp_set_num_threads(iCPU); 
     #pragma omp parallel for ordered 
    for(i=0;i<i_count;i+=16) 
    { 
     fread(Store,sizeof(char),16,Rfile);// read 
     ENCRYPT(); 
     #pragma omp ordered 
     fwrite(Store,sizeof(char),16,Wfile) // write 
    } 

該程序它假設工作並行但保存到文件工作順序,但程序的執行表明它按順序工作。

回答

1

將整個文件讀入一個線程中的緩衝區,並行處理緩衝區而不使用有序,然後將緩衝區寫入一個線程會好得多。像這樣的東西

fread(Store,sizeof(char),icount,Rfile);// read 
#pragma omp parallel for schedule(static) 
for(i=0;i<i_count;i+=16) { 
    ENCRYPT(&Store[i]); //ENCRYPT acts on 16 bytes at a time  
} 
fwrite(Store,sizeof(char),icount,Wfile) // write 

如果文件太大而無法一次全部讀取,那麼以循環的塊形式進行。重點是ENCRYPT函數應該比讀寫文件慢得多。否則,無論如何,使用多線程都沒有意義,因爲你不能真正加速閱讀使用多線程的文件。

+0

正如我前面提到的,加密過程中使用的文件的大小很大,不能直接將它移動到矩陣。 sot指令「fread(Store,sizeof(char),icount,Rfile); //讀取」,不是有用的,是否有另一個選項? – user3540874