test.fa.gz ファイルには、次のように複数の 4 行が含まれています。
@HWI-ST298:420:B08APABXX:3:1101:1244:2212 1:N:0:TCATTC
GGCAAGGCACTTACTTTACAGCTAAAGAAGTGCAGC
+
@@@FDFFDFHCFDACGHC<<CCFEHHFCCFCEE:C?
私がやりたいことは、OpenMP と並行して *.fq.gz ファイルを 4 行ごとに読み取ることです。コード ブローは正常にコンパイルできますが、正しくない結果が表示されることがあります。各 for ループで、getline() を 4 回使用してファイルを読み取りました。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();
}