2015-10-22 3 views
1

Ниже минимальный пример иллюстрирует поведение stxxl при инициализации контейнеров параллельно (с использованием OpenMP):Параллельный STXXL вектор инициализации

#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-контейнеры в нескольких потоках?

ответ

2

Инициализация контейнеров 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; 
} 
+0

И, конечно же, если вся цель вашего цикла, чтобы построить эти емкости, вы не будете видеть в основном никакой выгоды для запуска этого в OpenMP против последовательно из соотношения от серийной до параллельной работы. – NoseKnowsAll

+0

Просто минимальный пример концепции параллельной инициализации –

+0

Вы уверены, что инициализация векторов действительно не является потокобезопасной? http://stxxl.sourceforge.net/tags/master/faq.html#faq_threadsafe утверждает, что доступ к различным структурам данных из параллельных потоков в порядке. Я предполагаю, что только первая инициализация STXXL не является потокобезопасной. Когда я добавляю 'VEC_T u;' перед параллельным разделом, я больше не получаю никаких ошибок. – michitux

 Смежные вопросы

  • Нет связанных вопросов^_^