Параллельная инициализация вектора STXXL

Следующий минимальный пример иллюстрирует поведение stxxl при параллельной инициализации контейнеров (с использованием openMP):

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

typedef stxxl::VECTOR_GENERATOR<float>::result VEC_T;

int main(int argc, char* argv[]) {
    const unsigned long NUM = 8;
    #pragma omp parallel num_threads(NUM) 
    {       
            VEC_T v;
            printf("%d\t%p\n", omp_get_thread_num(), &v);
    }
    return EXIT_SUCCESS;
}

врезаться в

[STXXL-ERROR] File too large 

или же

[SYSTEM-ERROR]Segmentation fault

Как разместить контейнеры stxxl в нескольких потоках?

1 ответ

Решение

Инициализация контейнеров stxxl не является поточно-ориентированной, поэтому необходимо взаимное исключение для потока, инициализирующего контейнер. Используя openMP, это будет выглядеть следующим образом:

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

typedef stxxl::VECTOR_GENERATOR<float>::result VEC_T;

int main(int argc, char* argv[]) {
    const unsigned long NUM = 8;
    #pragma omp parallel num_threads(NUM) 
    {
            VEC_T* v;
            #pragma omp critical
            {
                    v = new VEC_T();
            }
            printf("%d\t%p\n", omp_get_thread_num(), &v);
            delete v;
    }
    return EXIT_SUCCESS;
}
Другие вопросы по тегам