Как открыть файл в многопоточном режиме (более 10 потоков) с помощью OpenMP - PullRequest
1 голос
/ 04 августа 2020

Извините, я не очень хорошо разбираюсь в английском sh.

Я пытаюсь загрузить файлы изображений в многопоточном режиме с помощью OpenMP. Но когда я устанавливаю количество потоков (num_threads ()) на 10 и выполняю программу, программа показывает «Ошибка сегментации». Если я установлю количество потоков на 9, он будет работать. Мой сервер (centos7.6) имеет 32 максимально доступных потока и 350 ГБ памяти. Итак, я думаю, что можно загружать 10 файлов изображений одновременно. Я не знаю, почему это происходит. Есть ли ограничения на открытие файлов в многопоточном режиме?

Это мой пример кода.

#include <stdio.h>
#include <omp.h>

int main()
{
    int i = 0;
    char target_file[256] = { 0 };

    omp_set_nested(1);

    printf("maximum available threads : %d\n", omp_get_max_threads());

#pragma omp parallel for private(target_file) num_thread(10)
    for (i = 1; i < 100; i++) {
        sprintf(target_file, "./data/%d.bmp", i);
        printf("[%d]:target file : %s\n", omp_get_thread_num(), target_file);

        FILE *fp;
        fp = fopen(target_file, "rw");
        if (fp == NULL) {
            printf("failed to open file : %s\n", target_file);
        }

        printf("[%d]: %d.bmp file opened.\n", omp_get_thread_num(), i);

        fclose(fp);
    }
}

Это вывод, когда я устанавливаю num_threads () равным 10.

maximum available threads : 32
[8]:target file : ./data/81.bmp
[5]:target file : ./data/51.bmp
[0]:target file : ./data/1.bmp
[6]:target file : ./data/61.bmp
[0]: 1.bmp file opened.
[0]:target file : ./data/2.bmp
[6]: 61.bmp file opened.
[9]:target file : ./data/91.bmp
[3]:target file : ./data/31.bmp
[4]:target file : ./data/41.bmp
[8]: 81.bmp file opened.
[4]: 41.bmp file opened.
[4]:target file : ./data/42.bmp
[4]: 42.bmp file opened.
[0]: 2.bmp file opened.
[0]:target file : ./data/3.bmp
[0]: 3.bmp file opened.
[0]:target file : ./data/4.bmp
[0]: 4.bmp file opened.
[0]:target file : ./data/5.bmp
[0]: 5.bmp file opened.
[0]:target file : ./data/6.bmp
[0]: 6.bmp file opened.
[0]:target file : ./data/7.bmp
[0]: 7.bmp file opened.
[0]:target file : ./data/8.bmp
[0]: 8.bmp file opened.
[0]:target file : ./data/9.bmp
[0]: 9.bmp file opened.
[9]: 91.bmp file opened.
[8]:target file : ./data/82.bmp
[7]:target file : ./data/71.bmp
[5]: 51.bmp file opened.
[4]:target file : ./data/43.bmp
[4]: 43.bmp file opened.
[4]:target file : ./data/44.bmp
[4]: 44.bmp file opened.
[0]:target file : ./data/10.bmp
[0]: 10.bmp file opened.
[8]: 82.bmp file opened.
[5]:target file : ./data/52.bmp
[7]: 71.bmp file opened.
[1]:target file : ./data/11.bmp
[6]:target file : ./data/62.bmp
[3]: 31.bmp file opened.
[4]:target file : ./data/45.bmp
[4]: 45.bmp file opened.
[4]:target file : ./data/46.bmp
[4]: 46.bmp file opened.
[4]:target file : ./data/47.bmp
[4]: 47.bmp file opened.
[4]:target file : ./data/48.bmp
[4]: 48.bmp file opened.
[4]:target file : ./data/49.bmp
[8]:target file : ./data/83.bmp
[5]: 52.bmp file opened.
[7]:target file : ./data/72.bmp
[1]: 11.bmp file opened.
[6]: 62.bmp file opened.
[3]:target file : ./data/32.bmp
[2]:target file : ./data/21.bmp
[4]: 49.bmp file opened.
[8]: 83.bmp file opened.
[5]:target file : ./data/53.bmp
[7]: 72.bmp file opened.
[7]:target file : ./data/73.bmp
[7]: 73.bmp file opened.
[7]:target file : ./data/74.bmp
[7]: 74.bmp file opened.
Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 05 августа 2020

Файлы закрываются, даже если они не открываются, вызывая ошибку sh. Причем num_threads(10) следует использовать вместо num_thread. Наконец, перемещение target_file в раздел более эффективно и безопасно. Вот полученный код:

#include <stdio.h>
#include <omp.h>

int main()
{
    int i = 0;

    omp_set_nested(1);

    printf("maximum available threads : %d\n", omp_get_max_threads());

    #pragma omp parallel for num_threads(10)
    for (i = 1; i < 100; i++) {
        char target_file[256] = { 0 };

        sprintf(target_file, "./data/%d.bmp", i);
        printf("[%d]:target file : %s\n", omp_get_thread_num(), target_file);

        FILE *fp;
        fp = fopen(target_file, "rw");
        if (fp == NULL) {
            printf("failed to open file : %s\n", target_file);
            continue;
        }

        printf("[%d]: %d.bmp file opened.\n", omp_get_thread_num(), i);

        fclose(fp);
    }
}

PS: обратите внимание, что вы можете использовать переменную среды OMP_NUM_THREADS для настройки количества потоков, используемых во время выполнения, вместо того, чтобы исправлять это вручную в коде (это более гибко и переносной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...