Всем доброго времени суток.
Вот задали написать программу по оптимизации вычислений векторов с использованием SSE комманд. Если кто сталкивался или работал, прошу помочь, так как гугль ничего толкового не дал.
Вот код программы:
#include <cstdio>
#include <cmath>
#include <malloc.h>
#include <xmmintrin.h>
#include <stdlib.h>
void ComputeArrayCpp(float *pArray1, float *pArray2, float *pResult, int nSize)
{
int i;
float *pSource1 = pArray1;
float *pSource2 = pArray2;
float *pDest = pResult;
for (i = 0; i < nSize; ++i)
{
*pDest = (float) sqrt((*pSource1) * (*pSource1) + (*pSource2) * (*pSource2)) + 0.5f;
pSource1++;
pSource2++;
pDest++;
}
}
void ComputeArrayCppSSE(float *pArray1, float *pArray2, float *pResult, int nSize)
{
int nLoop = nSize / 4;
__m128 m1;
__m128 m2;
__m128 m3;
__m128 m4;
__m128 *pScr1 = (__m128*) pArray1;
__m128 *pScr2 = (__m128*) pArray2;
__m128 *pDest = (__m128*) pResult;
__m128 m0_5 = _mm_set_ps1(0.5f);
for (int i = 0; i < nLoop; ++i)
{
m1 = _mm_mul_ps(*pScr1, *pScr1);
m2 = _mm_mul_ps(*pScr2, *pScr2);
m3 = _mm_add_ps(m1, m2);
m4 = _mm_sqrt_ps(m3);
*pDest = _mm_add_ps(m4, m0_5);
pScr1++;
pScr2++;
pDest++;
}
}
void init(float *a, int size)
{
for (int i = 0; i < size; i++)
{
float x = (float)rand()/RAND_MAX;
a = sin(x);
}
}
/*
*
*/
int main()
{
const int MAX_SIZE = 10000000;
float *a = (float*)_aligned_malloc(sizeof(float)*MAX_SIZE, 16);
float *b = (float*)_aligned_malloc(sizeof(float)*MAX_SIZE, 16);
float *c = (float*)_aligned_malloc(sizeof(float)*MAX_SIZE, 16);
init(a, MAX_SIZE);
init(b, MAX_SIZE);
ComputeArrayCpp(a, b, c, MAX_SIZE);
ComputeArrayCppSSE(a, b, c, MAX_SIZE);
_aligned_free(a);
_aligned_free(a);
_aligned_free(a);
return 0;
}
Первоночально компилил:
gcc -c main.cpp(имя файла с кодом).
Выдал кучу ошибок связанных с работой SSE процессоров.
In file included from main.cpp:10:
/usr/lib/gcc/i486-linux-gnu/4.4.3/include/xmmintrin.h:32:3: error: #error "SSE instruction set not enabled"
main.cpp: In function ‘void ComputeArrayCppSSE(float*, float*, float*, int)’:
main.cpp:33: error: ‘__m128’ was not declared in this scope
main.cpp:33: error: expected ‘;’ before ‘m1’
main.cpp:34: error: expected ‘;’ before ‘m2’
main.cpp:35: error: expected ‘;’ before ‘m3’
main.cpp:36: error: expected ‘;’ before ‘m4’
main.cpp:38: error: ‘pScr1’ was not declared in this scope
main.cpp:38: error: expected primary-expression before ‘)’ token
main.cpp:38: error: expected ‘;’ before ‘pArray1’
main.cpp:39: error: ‘pScr2’ was not declared in this scope
main.cpp:39: error: expected primary-expression before ‘)’ token
main.cpp:39: error: expected ‘;’ before ‘pArray2’
main.cpp:40: error: ‘pDest’ was not declared in this scope
main.cpp:40: error: expected primary-expression before ‘)’ token
main.cpp:40: error: expected ‘;’ before ‘pResult’
main.cpp:42: error: expected ‘;’ before ‘m0_5’
main.cpp:46: error: ‘m1’ was not declared in this scope
main.cpp:46: error: ‘_mm_mul_ps’ was not declared in this scope
main.cpp:47: error: ‘m2’ was not declared in this scope
main.cpp:48: error: ‘m3’ was not declared in this scope
main.cpp:48: error: ‘_mm_add_ps’ was not declared in this scope
main.cpp:49: error: ‘m4’ was not declared in this scope
main.cpp:49: error: ‘_mm_sqrt_ps’ was not declared in this scope
main.cpp:50: error: ‘m0_5’ was not declared in this scope
main.cpp: In function ‘int main(int, char**)’:
main.cpp:74: error: ‘_alligned_malloc’ was not declared in this scope
main.cpp:84: error: ‘_alligned_free’ was not declared in this scope
Хотя вроде библиотеки все есть. Решил большую часть из них добавив в компилятор опцию работы с sse-процами, однако при повторной компиляции выдал следующее:
sfh@terminal:~$ gcc -msse main.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:74: error: ‘_alligned_malloc’ was not declared in this scope
main.cpp:84: error: ‘_alligned_free’ was not declared in this scope
Подскажите пожалуйста что делать....
И еще. В виндовс есть библиотека windows.h в которой есть класс DWORD, с использованием которого можно замерять время выполнения программы. Есть ли что-то подобное в Linux-библиотеках?
Заранее спасибо.