2016-09-25 6 views
0

私は何百ものjpg画像をdicomに変換する必要があります。私はこの作品がもともとNode.jsで作られたWebアプリケーションを持っていますが、非常に遅いです。私はCで行い、次のコードを並列化するためのOpenMPを使用することを考えた:openmpを使ってjpg2dicomを変換するには?

int main(){ 
    DIR *dir; 
    struct dirent *arq; 
    dir = opendir("./jpg"); 
    char cmd1[255] = "./dcm4che-2.0.23/bin/jpg2dcm -c dcm4che-2.0.23/etc/jpg2dcm/jpg2dcm.cfg jpg/"; 
    char cmd_aux[255] = "./dcm4che-2.0.23/bin/jpg2dcm -c dcm4che-2.0.23/etc/jpg2dcm/jpg2dcm.cfg jpg/"; 
    char buf[255]; 
    char nomeArq[255]; 
    int i; 
    //Stretch in which I use openmp 
    while ((arq = readdir(dir)) != NULL){ 
     strncpy(nomeArq, arq->d_name, 255); 
     if(nomeArq[0] != '.'){ 
      sprintf(buf, " dcm/imagem-%d.dcm", i); 
      strcat(cmd1, nomeArq); // cmd1 + nomeArquivo 
      strcat(cmd1, buf); 
      system(cmd1); 
      strncpy(cmd1, cmd_aux, 255); 
    } 
     i++; 
    } 
    closedir(dir); 
    return 0; 
} 

は、どのように私は、このコードはI/Oバウンドである、私は本当にOpenMPでは任意のスピードアップを得ることができない場合はお願いしたいと思い知っています。そして可能であれば、openmpを使ってこのループを並列化する方法。もし私が非常に明確でなかったら、申し訳ありません!私はまだ英語を勉強しています!

+0

すでに外部コマンドを使用している場合は、使用を検討してください[GNUパラレル](https://www.gnu.org/software/parallel/)、または[ 'xargsの-P'](HTTPS:/ /linux.die.net/man/1/xargs)、それほどコードを書く必要はありません – dvhh

+0

ありがとう、dvhh!私は見てみましょう! :) – Thales

答えて

1

バッシュソリューション

まず既存のツールと考えるならば、あなたのタスクが容易になるだろう:xargsとマルチプロセスの引数

例と

  • GNU Parallel
  • xargsを(あなたのbashコマンドプロンプトから):

    ls ./jpg | xargs -P 0 -i ./dcm4che-2.0.23/bin/jpg2dcm -c dcm4che-2.0.23/etc/jpg2dcm/jpg2dcm.cfg jpg/{} dcm/{}.dcm 
    

    のOpenMP(それを行う方法についてのStackoverflow code

    あなたが配列にファイルのリストを入れて起動することができforループで動作するように簡単です。

    // put your code for reading he files list into an array // 
    
    int main() { 
        char **files; 
        const size_t count = file_list("./jpg", &files); 
    
        #pragma omp parallel for 
        for(size_t i=0;i<count;++i) { 
         if(files[i][0] == '.') { continue; } // 'skip' directory entry, maybe you should implement some better check (extension, or even checking if it is a file at all) 
         // keep the buffer local to the loop 
         char *buf = malloc(1024); 
         // already calling sprintf, use it for building the whole command line, and avoid the strncpy & strcat 
         sprintf(buf, "./dcm4che-2.0.23/bin/jpg2dcm -c dcm4che-2.0.23/etc/jpg2dcm/jpg2dcm.cfg jpg/%s dcm/imagem-%zu.dcm",files[i],i); 
         system(buf); 
         free(buf); // cleanup 
        } 
        return EXIT_SUCCESS; 
    } 
    
関連する問題