2016-11-17 2 views
1

У меня есть следующие инструкции:Использование OMP SIMD без для

unsigned long int xDiff = seq1.x^seq2.x; 
unsigned long int yDiff = seq1.y^seq2.y; 
unsigned long int zDiff = seq1.z^seq2.z; 

Можно векторизации это с помощью omp simd?

+0

Как объявляются ваши переменные? Вам действительно нужно векторизовать только три операции? Они в петле? –

+0

@VladimirF Это структура ulong3 от cuda_api (код запускается как в cuda, так и в XeonPhi). И да, это внутри какое-то время (это не может быть преобразовано в форму). –

ответ

1

На самом деле, если вы определяете позиции как массив, вам не нужно ничего делать, компилятор будет его векторизовать для вас.

struct position { 
    unsigned long pos[3]; 
}; 

struct position foo(struct position seq1, struct position seq2) { 
    struct position diff; 

    for(int i = 0; i < 2; ++i) 
    diff.pos[i] = seq1.pos[i]^seq2.pos[i]; 

    return diff; 
} 

GCC, так как 4,6 будет векторизации его, используя только -O3 флаг. Если вы предоставляете специфические для архитектуры флаги (например, с векторными расширениями Intel: -msse42, -mavx и т. Д.), Вы можете контролировать, какую векторную инструкцию установить компилятор должен использовать. Если вы хотите просто создать для своей собственной машины, вы можете скомпилировать ее с помощью -march=native.

foo(position, position): 
    movdqu xmm1, XMMWORD PTR [rsp+32] 
    mov  rax, rdi 
    movdqu xmm0, XMMWORD PTR [rsp+8] 
    pxor xmm0, xmm1 
    movdqu XMMWORD PTR [rdi], xmm0 
    ret 

Если вы "не раскатывать петлю вручную" (например, в вашем примере)

diff.pos[0] = seq1.pos[0]^seq2.pos[0]; 
diff.pos[1] = seq1.pos[1]^seq2.pos[1]; 
diff.pos[2] = seq1.pos[2]^seq2.pos[2]; 

Это уже не так:

foo(position, position): 
    mov  rdx, QWORD PTR [rsp+32] 
    xor  rdx, QWORD PTR [rsp+8] 
    mov  rax, rdi 
    mov  QWORD PTR [rdi], rdx 
    mov  rdx, QWORD PTR [rsp+40] 
    xor  rdx, QWORD PTR [rsp+16] 
    mov  QWORD PTR [rdi+8], rdx 
    mov  rdx, QWORD PTR [rsp+48] 
    xor  rdx, QWORD PTR [rsp+24] 
    mov  QWORD PTR [rdi+16], rdx 
    ret 

Кроме того, #pragma omp simd директива может быть только применяемые к петлям:

simd [2.8.1] Применяется к цикл, указывающий, что цикл может быть преобразован в цикл SIMD.

#pragma omp simd [clause[,] clause] ...] 
    for-loops 
Смежные вопросы