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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
B9
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 5
#1

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

16.12.2012, 15:13. Просмотров 374. Ответов 6
Метки нет (Все метки)

Вставка находит скалярное произведение двух векторов, помогите запустить

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
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 15:13     Не могу запустить ассемблерную вставку на c++
Посмотрите здесь:

C++ не могу правильна запустить графический режим в bc 3.1
C++ Помогите написать очень маленькую ассемблерную вставку
Не могу запустить code blocks C++
Как сделать ассемблерную вставку? C++
C++ не могу запустить программу
Не могу запустить программу на DEV c++ C++
пишу программу на С++, и делаю в ней ассемблеровскую вставку. Возможно ли в этой _asm вставке сделать С++ вставку? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
16.12.2012, 17:37     Не могу запустить ассемблерную вставку на c++ #2
Цитата Сообщение от B9 Посмотреть сообщение
Не могу запустить ассемблерную вставку на c++
А что значит "не могу запустить"? В чем именно проблема?
Кстати Visual Studio на 64 битной платформе не поддерживает inline assembler, поэтому если у тебя именно студия на 64 битах, то проблема в этом.
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++
1286 / 1220 / 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++
1286 / 1220 / 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++ Нужно переделать С++ функцию на ассемблерную вставку
Не могу запустить g++ C++
C++ Не могу запустить следующий код

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 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++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru