Параллельная инициализация вектора 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;
}