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

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

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
#1

Обнулить элементы вектора через __asm - C++

06.04.2014, 15:06. Просмотров 846. Ответов 24
Метки нет (Все метки)

Хочу обнулить элементы вектора через __asm

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
#include <vector>
#include <iostream>
 
using namespace std;
 
void main() {
   vector<vector<int>> v(2, vector <int> (3, 1));
 
   __asm {
      mov ecx, 2
      mov edi, v
      mov eax, dword ptr [edi + 16]
      mov edi, [edi][1]
        
      //mov dword ptr [edi + 8], 0
   cycl:
      mov dword ptr [edi + ecx*4], 0
      //add eax, 4
      loop cycl
   }
     
   for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 3; ++j)
         cout << v[i][j] << " ";
      cout << endl;
   }
}
Сам вопрос: eax и edi имеют разные значения, причем в eax лежит правильный результат. Я же хочу получить доступ ко 2-й строке через индексацию [1]. Как это реализовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 15:06     Обнулить элементы вектора через __asm
Посмотрите здесь:
Дан список, элементы которого являются координатами вектора. Найти длину вектора C++
STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора C++
C++ Используя алгоритм adjacent_find, обнулить первую пару соседних элементов вектора, имеющих одинаковую чётность
Заменить первые два нулевые элементы заданного вектора В на два первых НЕ нулевые элементы этого вектора C++
C++ Заменить первых 2 нулевые элементы заданного вектора соответственно на первых 2 не нулевые элементы этого вектора
Обнулить элементы матрицы C++
Обнулить нечетные элементы матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
10.04.2014, 19:14  [ТС]     Обнулить элементы вектора через __asm #16
а вам весь код нужен (он оч. большой)? или только того участка, за место чего __asm вставлялась?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
10.04.2014, 19:16     Обнулить элементы вектора через __asm #17
Минимальный компилируемый код, на котором можно пронаблюдать разницу в производительности.
DrOffset
7062 / 4203 / 949
Регистрация: 30.01.2014
Сообщений: 6,969
10.04.2014, 19:19     Обнулить элементы вектора через __asm #18
mat_for_c, если кинешь вложением в личку или сюда (как удобнее), то мне все равно какого он размера Компилятор Visual Studio я так понимаю?
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
10.04.2014, 19:59  [ТС]     Обнулить элементы вектора через __asm #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Visual Studio
VS 2010 professional

Добавлено через 43 секунды
я тогда щас похожий код настрочу...

Добавлено через 31 минуту
вот та минимальная часть кода:
Кликните здесь для просмотра всего текста
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
46
47
48
49
#include <vector>
#include <iostream>
#include <algorithm>
#include <time.h>
 
using namespace std;
 
int main() {
   vector <int> vec(50000, 10);
   vector <int> zero_position;
 
   int i;
   for (i = 3; i < 45000; ++i)
      zero_position.push_back(i);
   int size_ZPos = zero_position.size();
    
   clock_t begin = clock();
   for (int j = 0; j < 400000; ++j) {
      for (i = 0; i < size_ZPos; ++i)
         vec[zero_position[i]] = 0;
   }
   cout << "for " << (clock() - begin)/1000.0 << endl;
 
   fill(vec.begin(), vec.end(), 10); // вернем исходное значение
 
   // далее __asm
 
   vector <int> :: iterator ptr_ZPos = zero_position.begin();
   // он мне нужен, т.к. zero_position берется из vector<vector<int>>
   // чтобы знать смещение от начала (грубо говоря)
   clock_t asm_begin = clock();
   for (int j = 0; j < 400000; ++j) {
      __asm {
         mov ecx, size_ZPos
         mov eax, vec
         mov ebx, ptr_ZPos
cycle:
         mov edx, [ebx] // получили номер обнуляющей позиции
         shl edx, 2 // смещение для int кратно 4, делаю сдвиг
         mov dword ptr [eax + edx], 0
         add ebx, 4
         loop cycle
         mov edx, [ebx]
         shl edx, 2
         mov dword ptr [eax + edx], 0
      }
   }
   cout << "asm " << (clock() - asm_begin)/1000.0 << endl;
}
DrOffset
7062 / 4203 / 949
Регистрация: 30.01.2014
Сообщений: 6,969
10.04.2014, 20:44     Обнулить элементы вектора через __asm #20
mat_for_c, проверил, спасибо.
На своей системе получил 11с на коде компилятора, против 41с асма (который кстати еще можно улучшить). У меня i3.
По поводу твоего результата на AMD: в целом это значит, что VS делает свои оптимизации с заточкой на Intel платформу.

Однако тут попутно возникла пара проблем.
Во-первых, если я переношу код в функцию или немного меняю порядок или способ передачи векторов в нее, то программа начинает падать. Ну это было ожидаемо и об этом я предупреждал.
Во-вторых, и это более важно. После работы обоих алгоритмов векторы не равны между собой (я сохранил результата работы первого алгоритма и сравнил с результатом второго, векторы не равны). Это значит, что асм делает заполнение как-то иначе. И это - проблема.
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
10.04.2014, 21:54  [ТС]     Обнулить элементы вектора через __asm #21
Цитата Сообщение от DrOffset Посмотреть сообщение
VS делает свои оптимизации с заточкой на Intel платформу
чтобы в этом убедиться, надо построить проект на AMD, а потом запустить на Intel
DrOffset
7062 / 4203 / 949
Регистрация: 30.01.2014
Сообщений: 6,969
10.04.2014, 22:19     Обнулить элементы вектора через __asm #22
Цитата Сообщение от mat_for_c Посмотреть сообщение
чтобы в этом убедиться, надо построить проект на AMD
Это не поможет. Не важно на какой платформе строить. Просто у Microsoft c Intel партнерство и их компилятор заточен под Intel лучше. Нужно найти компилятор, с оптимизациями для AMD и строить проект на нем.
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
11.04.2014, 14:14  [ТС]     Обнулить элементы вектора через __asm #23
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не поможет
посмотрел что имеется в папке VC/lib, увидел, что там еще лежит папка AMD. может, если через нее собирать проект, то на AMD нормально по скорости получится?
DrOffset
7062 / 4203 / 949
Регистрация: 30.01.2014
Сообщений: 6,969
11.04.2014, 14:50     Обнулить элементы вектора через __asm #24
Цитата Сообщение от mat_for_c Посмотреть сообщение
лежит папка AMD. может, если через нее собирать проект, то на AMD нормально по скорости получится?
Возможно, не могу точно сказать. Но попробовать стоит.
Может быть еще это поможет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 22:16     Обнулить элементы вектора через __asm
Еще ссылки по теме:
C++ Массивы. Обнулить элементы столбцов
Обнулить элементы матрицы A=176 C++
Обнулить четные элементы матрицы C++
C++ Обнулить все положительные элементы матрицы
Обнулить элементы заданного столбца матрицы C++

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

Или воспользуйтесь поиском по форуму:
mat_for_c
140 / 135 / 29
Регистрация: 26.04.2013
Сообщений: 650
Завершенные тесты: 2
11.04.2014, 22:16  [ТС]     Обнулить элементы вектора через __asm #25
Цитата Сообщение от DrOffset Посмотреть сообщение
. После работы обоих алгоритмов векторы не равны между собой (я сохранил результата работы первого алгоритма и сравнил с результатом второго, векторы не равны). Это значит, что асм делает заполнение как-то иначе. И это - проблема.
мой косяк. ошибся в расчетах итераций цикла. последние 3 строчки во вставке не нужно было писать.
Yandex
Объявления
11.04.2014, 22:16     Обнулить элементы вектора через __asm
Ответ Создать тему
Опции темы

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