在c++中使用openmp进行多线程处理
multithreading using openmp in c++
如果我只想并行化循环并使用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函数应该比读取和写入文件慢得多。否则,无论如何使用多线程都没有意义,因为使用多线程无法真正加快读写文件的速度。
相关文章:
- 多线程处理中的静态成员变量
- Opencv cpp 使用多线程处理同一视频的不同部分
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- 使用 wxWidgets 进行多线程处理时出现奇怪的行为
- 通过多线程处理确定每个字符在文件中出现的次数
- 使用多线程处理的异步请求
- 多线程处理,同时保持部分序列
- 多线程MKL OpenMP用GCC编译
- 如何在类中进行 c++ 多线程处理(将线程引用保留为成员 var)
- SDL 带变量的多线程处理 -- 无法按预期工作
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 如何使用"priority"进行多线程处理?
- 使用简单的过程进行慢速多线程处理
- C++11 使用共享对象的多线程处理
- 在多线程处理时将参数传递给函数
- 多线程环境 (OpenMP) 中的 OpenCV 会导致分段错误
- 使用 vfork 进行多线程处理
- C++ 多线程处理速度慢
- 在 c++ 中多线程处理时与 cout 和 printf 的区别
- 在c++中使用openmp进行多线程处理