Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Векторная обработка данных с использованием SIMD - команд  (Прочитано 1240 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Всем доброго времени суток.
Вот задали написать программу по оптимизации вычислений векторов с использованием 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-библиотеках?
Заранее спасибо.

Оффлайн ii343hbka

  • Старожил
  • *
  • Сообщений: 1048
    • Просмотр профиля
время выполнения:

подключаете #include <time.h>

затем 2 переменные типа clock_t
clock_t start, end;затем
start = clock();
//
/* Код для измерения времени выполнения
//
end = clock();

float duration = (float)(end - start) / CLOCKS_PER_SEC;
cout << "Duration = " << duration;
ж)
ммм... Убунточка

Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Векторная обработка данных с использова&#
« Ответ #2 : 24 Февраль 2011, 21:25:14 »
Спасибо за совет))
а как насчет компиляции? почему-то компилятор студии работает без всяких опций и притензий... может подключить чего надо?
Кстати, что значит CLOCKS_PER_SEC. Это константа заранее заданная? тоесть если в винде ДВОРД выдает все в мс, то CLOCKS_PER_SEC по идее равно 1000, а сдесь?
« Последнее редактирование: 24 Февраль 2011, 21:26:57 от S_F_H »


Оффлайн S_F_H

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Векторная обработка данных с использова&a
« Ответ #4 : 25 Февраль 2011, 07:10:05 »
>> http://stackoverflow.com/questions/3839922/aligned-malloc-in-gcc
Гугл хром убунтовский категорически отказывается открывать)))
Но за совет спасибо. сегодня гляну))

Пользователь решил продолжить мысль 25 Февраль 2011, 19:01:23:
Всем спасибо за помощь, проблему решил.
Yurror наиогромнейшее спасибо за ссылку. Оказывается функции в этих библиотеках по-другому называются.
Тему можно закрывать
« Последнее редактирование: 25 Февраль 2011, 19:01:23 от S_F_H »

 

Страница сгенерирована за 0.385 секунд. Запросов: 24.