在c++中使用openmp进行多线程处理

multithreading using openmp in c++

本文关键字:多线程处理 openmp c++      更新时间:2023-10-16

如果我只想并行化循环并使用openmp顺序保存到文件,那么最好的解决方案是什么。我有一个文件,里面有大量的信息,我想分成相等的块(每个块16个字节),使用openmp(C++中的多线程编程)加密。加密过程完成后,这些块存储在单个文件中,但与原始文件的序列相同。

 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
    }

它认为程序是并行工作的,但保存到文件是顺序的,但程序的实现表明它是按顺序工作的。

最好在一个线程中将整个文件读取到缓冲区中,在不使用有序的情况下并行处理缓冲区,然后在一个螺纹中写入缓冲区。像这样的

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函数应该比读取和写入文件慢得多。否则,无论如何使用多线程都没有意义,因为使用多线程无法真正加快读写文件的速度。