Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
#1

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

06.04.2014, 15:06. Просмотров 925. Ответов 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]. Как это реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 15:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обнулить элементы вектора через __asm (C++):

Дан список, элементы которого являются координатами вектора. Найти длину вектора - C++
1. Дан список, элементы которого являются координатами вектора в n-мерном пространстве. Найти длину вектора.

STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора - C++
у меня есть вектор, помогите пожалуйста дописать функцию, которая будет искать элементы большее среднего арифметического вектора и удалять...

Используя алгоритм adjacent_find, обнулить первую пару соседних элементов вектора, имеющих одинаковую чётность - C++
Дан вектор V. Обнулить первую пару соседних элементов, имеющих одинаковую четность. Например, список 1, 2, 3, 4, 6, 8, 3, 1 должен быть...

Заменить первые два нулевые элементы заданного вектора В на два первых НЕ нулевые элементы этого вектора - C++
Дано вектор В, состоящий из N действительных чисел. Заменить первые два нулевые элементы заданного вектора В на два первых НЕ нулевые...

Заменить первых 2 нулевые элементы заданного вектора соответственно на первых 2 не нулевые элементы этого вектора - C++
Заданный вектор Т, который состоит из n действительных чисел. Заменить первых 2 нулевые элементы заданного вектора соответственно на первых...

Обнулить элементы матрицы - C++
Элементы матрицыT стоящие на пересечение четных строк и четных столбцов обнулить! РЕшите плиззззз :(((((((((:gcray2

24
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
10.04.2014, 19:14  [ТС] #16
а вам весь код нужен (он оч. большой)? или только того участка, за место чего __asm вставлялась?
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,095
10.04.2014, 19:16 #17
Минимальный компилируемый код, на котором можно пронаблюдать разницу в производительности.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.04.2014, 19:19 #18
mat_for_c, если кинешь вложением в личку или сюда (как удобнее), то мне все равно какого он размера Компилятор Visual Studio я так понимаю?
0
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
10.04.2014, 19:59  [ТС] #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;
}
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.04.2014, 20:44 #20
mat_for_c, проверил, спасибо.
На своей системе получил 11с на коде компилятора, против 41с асма (который кстати еще можно улучшить). У меня i3.
По поводу твоего результата на AMD: в целом это значит, что VS делает свои оптимизации с заточкой на Intel платформу.

Однако тут попутно возникла пара проблем.
Во-первых, если я переношу код в функцию или немного меняю порядок или способ передачи векторов в нее, то программа начинает падать. Ну это было ожидаемо и об этом я предупреждал.
Во-вторых, и это более важно. После работы обоих алгоритмов векторы не равны между собой (я сохранил результата работы первого алгоритма и сравнил с результатом второго, векторы не равны). Это значит, что асм делает заполнение как-то иначе. И это - проблема.
0
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
10.04.2014, 21:54  [ТС] #21
Цитата Сообщение от DrOffset Посмотреть сообщение
VS делает свои оптимизации с заточкой на Intel платформу
чтобы в этом убедиться, надо построить проект на AMD, а потом запустить на Intel
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
10.04.2014, 22:19 #22
Цитата Сообщение от mat_for_c Посмотреть сообщение
чтобы в этом убедиться, надо построить проект на AMD
Это не поможет. Не важно на какой платформе строить. Просто у Microsoft c Intel партнерство и их компилятор заточен под Intel лучше. Нужно найти компилятор, с оптимизациями для AMD и строить проект на нем.
0
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
11.04.2014, 14:14  [ТС] #23
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не поможет
посмотрел что имеется в папке VC/lib, увидел, что там еще лежит папка AMD. может, если через нее собирать проект, то на AMD нормально по скорости получится?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
11.04.2014, 14:50 #24
Цитата Сообщение от mat_for_c Посмотреть сообщение
лежит папка AMD. может, если через нее собирать проект, то на AMD нормально по скорости получится?
Возможно, не могу точно сказать. Но попробовать стоит.
Может быть еще это поможет.
0
mat_for_c
164 / 159 / 34
Регистрация: 26.04.2013
Сообщений: 724
Завершенные тесты: 3
11.04.2014, 22:16  [ТС] #25
Цитата Сообщение от DrOffset Посмотреть сообщение
. После работы обоих алгоритмов векторы не равны между собой (я сохранил результата работы первого алгоритма и сравнил с результатом второго, векторы не равны). Это значит, что асм делает заполнение как-то иначе. И это - проблема.
мой косяк. ошибся в расчетах итераций цикла. последние 3 строчки во вставке не нужно было писать.
0
11.04.2014, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 22:16
Привет! Вот еще темы с ответами:

Обнулить четные элементы матрицы - C++
Обнулить четные элементы матрицы 1 7 6 0 2 3 9 5 0

Обнулить элементы матрицы A=176 - C++
Помогите пожалуйста написать программу на С++, буду очень благодарна. Обнулить элементы матрицы (176) над главной диагональю. ...

Обнулить нечетные элементы матрицы - C++
Помогите плз. Обнулить нечетные элементы матрицы |1 7 6| |0 2 3 | |9 5 0|

Массивы. Обнулить элементы столбцов - C++
Здравствуйте! Всю жизнь программировал на Паскале и вдруг си++...помогите пожалуйста с заданием, желательно с объяснением, ибо чайник...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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