Форум программистов, компьютерный форум CyberForum.ru

Не могу запустить ассемблерную вставку на c++ - C++

Восстановить пароль Регистрация
 
B9
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 5
16.12.2012, 15:13     Не могу запустить ассемблерную вставку на c++ #1
Вставка находит скалярное произведение двух векторов, помогите запустить

C++
1
2
3
4
5
6
7
8
9
10
11
12
__asm
{
    movaps      xmm0, xmmword ptr[A]    // 0 | A.z | A.y | A.x
    movaps      xmm1, xmmword ptr[B]    // 0 | B.z | B.y | B.x
    mulps       xmm0, xmm1              // 0 | A.z*B.z | A.y*B.y | A.x*B.x
    movhlps     xmm1, xmm0      // ? | ? | 0 | A.z*B.z
    unpcklps    xmm0, xmm0      // A.y*B.y | A.y*B.y | A.x*B.x | A.x*B.x
    movhlps     xmm2, xmm0      // ? | ? | A.y*B.y | A.y*B.y
    addss       xmm0, xmm1      // ? | ? | ? | A.x*B.x+A.z*B.z
    addss       xmm0, xmm2      // ? | ? | ? | A.x*B.x+A.y*B.y+A.z*B.z
    movss       dword ptr[dot], xmm0
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
16.12.2012, 17:37     Не могу запустить ассемблерную вставку на c++ #2
Цитата Сообщение от B9 Посмотреть сообщение
Не могу запустить ассемблерную вставку на c++
А что значит "не могу запустить"? В чем именно проблема?
Кстати Visual Studio на 64 битной платформе не поддерживает inline assembler, поэтому если у тебя именно студия на 64 битах, то проблема в этом.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.12.2012, 17:43     Не могу запустить ассемблерную вставку на c++ #3
Цитата Сообщение от B9 Посмотреть сообщение
movhlps
это что за мнемоника?
Цитата Сообщение от B9 Посмотреть сообщение
movaps
и это?
Цитата Сообщение от B9 Посмотреть сообщение
addss
да и это тоже?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.12.2012, 17:46     Не могу запустить ассемблерную вставку на c++ #4
Цитата Сообщение от taras atavin Посмотреть сообщение
да и это тоже?
Команды для работы с SSE-регистрами.


Цитата Сообщение от B9 Посмотреть сообщение
помогите запустить
Полностью код функции нарисуй.
B9
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 5
16.12.2012, 20:19  [ТС]     Не могу запустить ассемблерную вставку на c++ #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <time.h>
#include <iostream>
 
int Scalar(short* Vector1, short* Vector2, int count)
{
 int iSum;
float dot;
// считаем, что четвертый элемент каждого вектора равен нулю
__asm
{
    movaps      xmm0, xmmword ptr[Vector1]    // 0 | A.z | A.y | A.x
    movaps      xmm1, xmmword ptr[Vector2]    // 0 | B.z | B.y | B.x
    mulps       xmm0, xmm1              // 0 | A.z*B.z | A.y*B.y | A.x*B.x
    movhlps     xmm1, xmm0      // ? | ? | 0 | A.z*B.z
    unpcklps    xmm0, xmm0      // A.y*B.y | A.y*B.y | A.x*B.x | A.x*B.x
    movhlps     xmm2, xmm0      // ? | ? | A.y*B.y | A.y*B.y
    addss       xmm0, xmm1      // ? | ? | ? | A.x*B.x+A.z*B.z
    addss       xmm0, xmm2      // ? | ? | ? | A.x*B.x+A.y*B.y+A.z*B.z
    movss       dword ptr[dot], xmm0
}
 
 return iSum;
}
 
int main()
{
 const int  n = 10000000;
 short *Vector1 = new short[n];
 short *Vector2 = new
short[n];
 int i;
 
 srand((unsigned int)time(0));
 for(i=0;i<n;i++)
 {
  Vector1[i] = rand()%2000 - 1000;
  Vector2[i] = rand()%2000 - 1000;
 }
 
 int iSum=Scalar(Vector1, Vector2, n);
 
 delete []Vector1;
 delete []Vector2;
 return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.12.2012, 07:56     Не могу запустить ассемблерную вставку на c++ #6
Ты помещаешь результат в dot, а возвращаешь iSum.
Код не проверял пока что.

Добавлено через 9 минут
Теперь кратко по коду - работать в таком виде он не будет:
1. movaps принимает данные типа float, ты же передаёшь short
2. Для этих функций данные должны быть выровненными (на 16 байт, кажется, но лучше уточнить для конкретной платформы). Т.е. нельзя использовать new, нужно либо выравнивать при выделении на стэке, либо aligned_malloc/aligned_free использовать (название переврал, ищи в гугле)
3. XMM регистры всего лишь по 128 бит, поэтому массив в 10000000 элементов в них не влезет, а цикла у тебя не предусмотрено.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 11:21     Не могу запустить ассемблерную вставку на c++
Еще ссылки по теме:

Не могу запустить программу C++
C++ Сделать из assembler кода ассемблерную вставку в C++
C++ Нужно переделать С++ функцию на ассемблерную вставку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
17.12.2012, 11:21     Не могу запустить ассемблерную вставку на c++ #7
И если вместо short сделать double (а не float), то нужно испльзовать SSE2, а не SSE. Там отличия в том, что в SSE XMM регистры трактуются как 4 * 32 (4 значения по 32 бита), а в SSE2 как 2 * 64 (ну отличия конечно не только в этом)).
Yandex
Объявления
17.12.2012, 11:21     Не могу запустить ассемблерную вставку на c++
Ответ Создать тему
Опции темы

Текущее время: 15:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru