Ошибка сегментации с использованием OpenMp и SSE - PullRequest
6 голосов
/ 16 июля 2011

Я только начинаю экспериментировать с добавлением OpenMP к некоторому коду SSE.

Моя первая тестовая программа SOMETIMES падает в _mm_set_ps, но работает, когда я устанавливаю if (0).

Itвыглядит так просто, что я, должно быть, упускаю что-то очевидное.Я компилирую с помощью gcc -fopenmp -g -march = core2 -pthreads

  #include <stdio.h>
  #include <stdlib.h>
  #include <immintrin.h>

  int main()
  {
  #pragma omp parallel if (1)
   {
  #pragma omp sections
       {
  #pragma omp section
           {
              __m128 x1 = _mm_set_ps ( 1.1f, 2.1f, 3.1f, 4.1f );
           }
  #pragma omp section
           {
              __m128 x2 = _mm_set_ps ( 1.2f, 2.2f, 3.2f, 4.2f );
           }
       } // end omp sections
   } //end omp parallel

  return 0;
  }

Ответы [ 2 ]

6 голосов
/ 16 июля 2011

Это ошибка в реализации openMP. У меня была такая же проблема в gcc на Windows (MinGW). -mstackrealign опция командной строки решила мою проблему. Это добавляет инструкцию к прологу каждой функции для выравнивания стека на 16-байтовой границе. Я не заметил никакого снижения производительности. Вы также можете попытаться добавить __attribute__ ((force_align_arg_pointer)) к объявлению функции, которое должно делать то же самое, но только для определенной функции. Возможно, вам придется поместить код SSE в отдельную функцию, которую вы затем вызываете из функции с помощью #pragma omp, чтобы у стека был шанс на выравнивание.

У меня перестала возникать проблема, когда я перешел на компиляцию для 64-битной цели (MinGW64, например TDM GCC build).

Я играю с инструкциями AVX, которые требуют 32-байтового выравнивания, но GCC вообще не поддерживает это для окон. Это заставило меня исправить созданный ассемблерный код, используя скрипт на Python, но он работает.

2 голосов
/ 16 июля 2011

Я чувствую запах невыровненного доступа к памяти.Это единственный способ, которым код может взорваться (при условии, что является единственным кодом там).Чтобы это произошло, регистры XMM не будут использоваться, вместо этого будет использоваться стековая память, которая выровнена только по 4 байта, я предполагаю, что код omp нарушает выравнивание стека.

...