test.fa.gz 文件包含多个 4 行作为打击:
@HWI-ST298:420:B08APABXX:3:1101:1244:2212 1:N:0:TCATTC
GGCAAGGCACTTACTTTACAGCTAAAGAAGTGCAGC
+
@@@FDFFDFHCFDACGHC<<CCFEHHFCCFCEE:C?
我想要做的是与 OpenMP 并行读取每四行 *.fq.gz 文件。code blow 可以编译成功,但有时会显示不正确的结果。在每个 for 循环中,我使用了 4 次 getline() 来读取文件。我不确定 OpenMP 将如何处理每个 for 循环中的多个作业,以及 .gz 文件句柄将如何在 OpenMP 的 for 循环之间移动。
我搜索了互联网和 OpenMP 文档以寻求帮助,但仍然不太明白。因此,任何帮助将不胜感激。
谢谢,
#include <iostream>
#include <string>
#include <cstdlib>
#include <gzstream.h>
#include <omp.h>
using namespace std;
string reverseStrand (string seq);
int main (int argc, char ** argv) {
const char* gzFqFile;
unsigned int nReads;
if (argc == 3) {
gzFqFile = argv[1];
nReads = atoi(argv[2]); }
else {
printf("\n%s <*.fq.gz> <number_of_reads>\n", argv[0]);
return 1; }
igzstream gz(gzFqFile);
string li, bp36, strand, revBp36;
unsigned int i;
#pragma omp parallel shared(gz) private(i,li,bp36,strand,revBp36)
{
#pragma omp for schedule(dynamic)
for(i = 0;i < nReads;++i) {
li = "";
bp36 = "";
strand = "";
revBp36 = "";
getline(gz,li,'\n');
getline(gz,li,'\n');
bp36 = li;
getline(gz,li,'\n');
strand = li;
getline(gz,li,'\n');
if(strand.compare("-") == 0) {
revBp36 = reverseStrand(bp36);
}
cout << bp36 << " " << strand << " " << revBp36 << "\n";
}
}
gz.close();
}