У меня есть следующие инструкции:Использование 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
?
У меня есть следующие инструкции:Использование 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
?
На самом деле, если вы определяете позиции как массив, вам не нужно ничего делать, компилятор будет его векторизовать для вас.
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
Как объявляются ваши переменные? Вам действительно нужно векторизовать только три операции? Они в петле? –
@VladimirF Это структура ulong3 от cuda_api (код запускается как в cuda, так и в XeonPhi). И да, это внутри какое-то время (это не может быть преобразовано в форму). –