2016-09-25 10 views
0

Мне нужно преобразовать сотни изображений jpg в dicom. У меня есть веб-приложение, в котором эта часть была первоначально сделана с помощью Node.js, но очень медленная. Я думал, что делать в 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 Parallel] (https://www.gnu.org/software/parallel/) или [ 'xargs -P'] (https://linux.die.net/man/1/xargs), которые не требуют от вас большого количества кода – dvhh

+0

Спасибо, dvhh! Я взгляну! :) – Thales

ответ

1

Bash решение

Во-первых, ваша задача будет проще, если бы вы считали существующие инструменты:

Пример с 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

Это проще работать с for петлями, вы могли бы положить начало списка файлов в массив (Stackoverflow code о том, как это сделать).

// 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; 
}