2016-06-04 3 views
0

Поскольку я потерялся из-за чтения SIMD и OpenMP в зависимости от векторизации, я хотел бы спросить вас, может ли кто-нибудь разъяснить мне вышеизложенное. В частности, у меня есть часть кода на C++, которую я хочу распараллелить, но на данный момент я очень надуман и не могу что-то понять сам по себе. Любая помощь, разрешающая мне, что именно представляет собой векторизация и как я могу ее использовать в следующей части кода, будет очень благодарна!Векторизация & #pragma omp simd

for(unsigned short i=1; i<=N_a; i++) { 
     for(unsigned short j=1; j<=N_b; j++) { 
      temp[0] = H[i-1][j-1]+similarity_score(seq_a[i-1],seq_b[j-1]); 
      temp[1] = H[i-1][j]-delta; 
      temp[2] = H[i][j-1]-delta; 
      temp[3] = 0.; 
      H[i][j] = find_array_max(temp, 4); 
      switch(ind) { 
      case 0:         // score in (i,j) stems from a match/mismatch 
       I_i[i][j] = i-1; 
       I_j[i][j] = j-1; 
       break; 
      case 1:         // score in (i,j) stems from a deletion in sequence A 
       I_i[i][j] = i-1; 
       I_j[i][j] = j; 
       break; 
      case 2:         // score in (i,j) stems from a deletion in sequence B 
       I_i[i][j] = i; 
       I_j[i][j] = j-1; 
       break; 
      case 3:         // (i,j) is the beginning of a subsequence 
       I_i[i][j] = i; 
       I_j[i][j] = j; 
       break; 
      } 
     } 
    } 

С уважением!

+0

SIMD на x86 все о загрузке 16В (или 32В) смежных данных, и делать, например, четыре 'float'' добавить 'параллельно, или два' double', или целые числа различной ширины. Или перетасовать/смешать/упаковать-сравнить, чтобы получить blend-mask/... –

+0

'H [i] [j]' в зависимости от 'H [i-1] [j-1]', 'H [ii] [ j] 'и' H [i] [j-1] ', нет прямого способа либо векторизации, либо параллелизации циклов в' i' или 'j'. Возможно, вы, вероятно, можете сделать компилятор для векселирования и/или параллелизации их с помощью '#pragma omp simd' и' #pragma omp parallel for', но вычисленный результат будет неправильным. – Gilles

ответ

1

So ind постоянный для обеих вложенных петель?

Вы можете скачать компилятору для автоматической подсерии этого словаря для OpenMP. (Put линии #pragma omp simd перед любым из ваших for петель, и посмотреть, если это влияет на ассемблер при компиляции с -O3. Я не знаю, OpenMP, что хорошо, так ИКА, если вам нужны другие варианты.)

Заверните в функции, которая фактически компилируется, поэтому я могу видеть, что происходит. (например, поместив код на http://gcc.godbolt.org/, чтобы получить красиво отформатированный выход asm).

Если он не авто-векторизовать, это, вероятно, не так уж сложно для векторизации вручную с помощью Intel intrinsics для x86, поскольку вы просто инициализируете некоторые массивы с помощью индекса массива. Ведите вектор счетчиков циклов, начиная с вектором __m128i jvec = _mm_set_epi32(3, 2, 1, 0);, и увеличить его с _mm_add_ps() с вектором [ 4 4 4 4 ] (_mm_set1_epi32(4)), чтобы увеличить каждый элемент на 4.

Держите отдельный вектор i значений, которые вы только изменить в внешний контур, но все же сохраняются во внутреннем цикле.


Смотрите теги вики для набора команд материала.

Смотрите теги вики для некоторых руководств SIMD, в том числе это хороший intro to SIMD and what it's all about.

+0

Но как я знаю, что вывод векторизован правильно и без каких-либо зависимостей? – Diaman

+0

@MrDiaman: Посмотрите на выход asm. Или, в зависимости от компилятора, есть варианты сообщать об успешности/неудаче автообсечения. С какими зависимостями вы беспокоитесь? –

+0

Мне нужна точность данных. Поэтому мы говорим о зависимостях данных. Я не знаю, как это может помочь, здесь https://github.com/MrDiaman/Proj/pull/1/files – Diaman

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