223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
||||||
1 | ||||||
Обнулить элементы вектора через __asm06.04.2014, 15:06. Показов 3085. Ответов 24
Метки нет (Все метки)
Хочу обнулить элементы вектора через __asm
0
|
06.04.2014, 15:06 | |
Ответы с готовыми решениями:
24
обнулить каждый 5-ый элемент вектора Дан список, элементы которого являются координатами вектора. Найти длину вектора STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора Используя алгоритм adjacent_find, обнулить первую пару соседних элементов вектора, имеющих одинаковую чётность |
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
06.04.2014, 17:14 | 2 |
mat_for_c, зачем это нужно?
Индексация в векторе - это вызов метода (operator[]). Для того чтобы правильно обратиться к внутренностям вектора через asm нужно знать устройство вектора. А так же про всякие штуки типа выравнивания. Внутреннее устройство вектора в общем случае не обязано быть идентичным на разных компиляторах или версиях одного и того же. Более того, код, который компилятор сделает из С++ кода вектора тоже зависит от многих вещей. Может так случиться, что с одним уровнем оптимизации твой асм будет работать, а с другим - нет.
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
07.04.2014, 19:19 [ТС] | 3 |
С этим я уже познакомился: например, в Debug не работает то, что работает в Release
А что именно знать надо? Пример можешь привести?
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|||||||||||||||||||||
07.04.2014, 20:31 | 4 | ||||||||||||||||||||
В общем случае это значит, что нужно знать как конкретный компилятор на конкретной платформе генерирует код.
Про выравнивание примеры есть по ссылке, много. PS. Если ты надеешься выиграть в скорости таким образом - я тебя разочарую, вряд ли удастся обогнать компилятор, максимум сравняешься в скорости. Зато код будет непереносим и труден в сопровождении. Добавлено через 10 минут mat_for_c, вот, к примеру, я написал такой код для обнуления:
Добавлено через 24 минуты Теперь добавим цикл для общего случая:
Кликните здесь для просмотра всего текста
В принципе можно отталкиваться от приведенных примеров для написания своего (только с учетом компилятора и версии, конечно же) Но на самом деле я привел их для того, чтобы показать, что компилятор не дурак и код будет эффективен, если изначально правильно написан. А главное его можно будет перенести без проблем на другой компилятор.
1
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
||||||
07.04.2014, 22:10 [ТС] | 5 | |||||
DrOffset, попробовал так:
Кликните здесь для просмотра всего текста
почему когда делаешь через итератор, изменения не сохраняются ???
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
08.04.2014, 00:12 | 6 |
mat_for_c, потому что так вообще нельзя делать. vector < vector <int> > - это ведь не просто двумерный массив. А итератор - это не просто указатель. И адрес его не обязан совпадать с адресом элемента. Вектор гарантирует только, что:
1) Память будет распределена непрерывной областью. 2) Операция взятия адреса от элемента даст адрес памяти в которой он находится. &v[0] - адрес первого вектора vector<int> &v[0][0] - адрес элемента int первого вектора. Чтобы правильно адресовать элементы - нужно выяснить механизм адресации, который использует компилятор. Лучший способ это выяснить - декомпилировать программу с нормальным обращением (код на С++) к элементу.
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
||||||
08.04.2014, 19:08 [ТС] | 7 | |||||
DrOffset, через итераторы работает )). Это я не правильно написал:
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
08.04.2014, 19:21 | 8 |
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
08.04.2014, 20:50 [ТС] | 9 |
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
08.04.2014, 22:09 | 10 |
Используй memset вместо цикла. Твой асм код пока что медленнее, чем делает компилятор.
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
10.04.2014, 18:52 [ТС] | 11 |
не все так просто. мне нужно не все элементы обнулять, а большинство из них (примерно 80 - 90 % от размера вектора)
вот какая штука: протестил я програмки (c __asm и без) на Intel core i5 M 460 2,53 Ghz и AMD Phenom II X6 1035T Processor 2,60 GHz. результаты: 14 сек __asm проиграл компилятору на Intel'е ~ 1 мин __asm выйграл компилятора на AMD
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
10.04.2014, 18:56 | 12 |
Тут еще надо детально закапываться в то, как именно тестили. Кастануть бы на форум Андрея Аксенова - он в паре матерных фраз объяснил бы как надо бенчмаркать)
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
10.04.2014, 18:59 | 13 |
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
10.04.2014, 19:05 [ТС] | 14 |
а что это ???
Добавлено через 2 минуты обычным способом: запускаем .exe и в самой программе через clock() замеряем время.
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
10.04.2014, 19:06 | 15 |
mat_for_c, Тест производительности
Добавлено через 44 секунды Я думаю он тоже имел в виду код, а не способ замера (хотя это тоже важно).
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
|
10.04.2014, 19:14 [ТС] | 16 |
а вам весь код нужен (он оч. большой)? или только того участка, за место чего __asm вставлялась?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
10.04.2014, 19:16 | 17 |
Минимальный компилируемый код, на котором можно пронаблюдать разницу в производительности.
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
10.04.2014, 19:19 | 18 |
mat_for_c, если кинешь вложением в личку или сюда (как удобнее), то мне все равно какого он размера Компилятор Visual Studio я так понимаю?
0
|
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
|
||||||
10.04.2014, 19:59 [ТС] | 19 | |||||
VS 2010 professional
Добавлено через 43 секунды я тогда щас похожий код настрочу... Добавлено через 31 минуту вот та минимальная часть кода: Кликните здесь для просмотра всего текста
0
|
18893 / 9850 / 2410
Регистрация: 30.01.2014
Сообщений: 17,293
|
|
10.04.2014, 20:44 | 20 |
mat_for_c, проверил, спасибо.
На своей системе получил 11с на коде компилятора, против 41с асма (который кстати еще можно улучшить). У меня i3. По поводу твоего результата на AMD: в целом это значит, что VS делает свои оптимизации с заточкой на Intel платформу. Однако тут попутно возникла пара проблем. Во-первых, если я переношу код в функцию или немного меняю порядок или способ передачи векторов в нее, то программа начинает падать. Ну это было ожидаемо и об этом я предупреждал. Во-вторых, и это более важно. После работы обоих алгоритмов векторы не равны между собой (я сохранил результата работы первого алгоритма и сравнил с результатом второго, векторы не равны). Это значит, что асм делает заполнение как-то иначе. И это - проблема.
0
|
10.04.2014, 20:44 | |
10.04.2014, 20:44 | |
Помогаю со студенческими работами здесь
20
Заменить первые два нулевые элементы заданного вектора В на два первых НЕ нулевые элементы этого вектора Заменить первых 2 нулевые элементы заданного вектора соответственно на первых 2 не нулевые элементы этого вектора Из вектора С(n) сформировать вектор A, содержащий чётные элементы вектора С и вектор В содержащий нечётные элементы Обнулить элементы матрицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |