Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
Заблокирован
1

Memory shift или самый быстрый способ перемещения блока памяти

30.10.2014, 18:45. Показов 5828. Ответов 50
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
int* dataField = new int[100]{0};
for (int i = 0; i < 50; i++)
    dataField[i] = 777;
 
    //тут должен быть memory shift
 
delete dataField;
В общем допустим есть массив под инты размером в 100. В первых 50-и содержаться какие - то полезные данные, какой существует самый быстрый способ перемещения этих данных в уже выделенной памяти из первых 50-и ячеек в последние? То есть сдвинуть надо вправо. Ну то есть чтоб значения, которые записаны в первых 50-и элементах массива, перенеслись бы в последние 50.

Речь идёт о памяти DDR SDRAM.
1. Может есть специальные процессорные команды процессоров последних поколений для такого перемещения памяти? 2. Может есть специальный тип памяти, не который позволяет делать memory shift?
3. Может есть специальный тип процессора для этих целей?

P.S. ассемблерный код приветствуется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2014, 18:45
Ответы с готовыми решениями:

Самый быстрый способ решения задачи a+b
несколько раз ходил на олимпиады, во многих из них в пробном туре даётся задача а+б, решаю её...

Самый быстрый способ дополнить вектор массивом
есть вектор заполненный нулями: vector&lt;int&gt; v(100000); есть большой массив: int ar;...

Самый быстрый способ посчитать сумма элементов матрицы, находящихся в матрице
Здравствуйте форумчане! Подскажите мне самый быстрый способ нахождении суммы элементов матрицы,...

Считать квадратную матрицу. Какой самый быстрый способ это сделать?
Какие самые быстрые способы считывания в с++? Пример : мне надо считать квадратную матрицу. Какой...

50
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 19:36 2
memcpy() используй. На ассемблере rep movsd или rep movsq, если кратно 8.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
30.10.2014, 19:46 3
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
какой существует самый быстрый способ перемещения этих данных в уже выделенной памяти из первых 50-и ячеек в последние?
DMA (Direct Memory Access) по русски ПДП (Прямой Доступ к Памяти)
обращение идет минуя процессор

https://ru.wikipedia.org/wiki/... п_к_памяти

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

Добавлено через 1 минуту
опять ссылку на вику не показывает
r u .wikipedia.org/wiki/Прямой_доступ_к_памяти
вот еще
http://habrahabr.ru/post/37455/
1
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 19:53 4
DMA для внешних устройств. Как это копировать поможет?
0
Заблокирован
30.10.2014, 19:54  [ТС] 5
А есть какая -то специальная команда типа SHIFT? Чтоб блок памяти сдвинуть? Вроде должна быть
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
30.10.2014, 19:54 6
Цитата Сообщение от nmcf Посмотреть сообщение
DMA для внешних устройств.
не всегда
Цитата Сообщение от nmcf Посмотреть сообщение
Как это копировать поможет?
например скинуть буфер в видеокарту
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 19:55 7
Я же тебе написал rep movsd. Одна команда. Перемещает блок по 4 байта.
0
Заблокирован
30.10.2014, 19:55  [ТС] 8
По большому счёту меня не DMA интересует, а именно здвиг памяти в сторону так сказать в уже алоцированном блоке.
0
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
30.10.2014, 19:55 9
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А есть какая -то специальная команда типа SHIFT? Чтоб блок памяти сдвинуть? Вроде должна быть
На 86 и 64 процессорах нету.
0
Заблокирован
30.10.2014, 19:57  [ТС] 10
Цитата Сообщение от nmcf Посмотреть сообщение
Перемещает блок по 4 байта.
А ШИФТА нет для большого блока?

Добавлено через 13 секунд
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
На 86 и 64 процессорах нету.
А на каких есть?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 19:58 11
DMA - это когда видеокарта (например) обращается к ОЗУ минуя процессор. Я что-то упустил?
0
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
30.10.2014, 19:58 12
Да как это сдвинуть, память сама по себе не предназначена для этого, с памяти только копировать и вставить, процессор как бы не хотел но этого не сделает.
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 20:00 13
Архитектура памяти не позволит двигать "блоки", максимум по 8 байт за итерацию.
0
Заблокирован
30.10.2014, 20:01  [ТС] 14
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
Да как это сдвинуть
Вот по этому я и спрашиваю, нет ли в SDRAM какого -то специального механизма для этого?

Добавлено через 24 секунды
Цитата Сообщение от nmcf Посмотреть сообщение
Архитектура памяти не позволит двигать "блоки", максимум по 8 байт за итерацию.
но это не передвижения, а копирование, верно?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 20:02 15
но это не передвижения, а копирование, верно?
А в чём разница? Тебе обнулять надо, что ли?
0
Студент
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
30.10.2014, 20:04 16
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А на каких есть?
Это вопрос больше к памяти, позволяет ли она это делать, а это никто не может. Мысль я понял, но нет, онли read/write.
0
Заблокирован
30.10.2014, 20:05  [ТС] 17
Цитата Сообщение от nmcf Посмотреть сообщение
А в чём разница?
Обнулять не надо.
Дело в том, что копирование идёт через процессор, то есть ячейка памяти заносится регистры процессора, а оттуда обратно в по нужному адресу отправляется. А сдвиг - это без процессора, по крайней мере я под здвигом это так вижу. То есть просто допустим если была команда для контроллера памяти: 0x00000001 - shift на 2 и всё, вся память сдвинулась на две ячейки допустим вправо целиком, грубо говоря как при битовом сдвиге >>
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
30.10.2014, 20:10 18
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А на каких есть?
ты конкретно
Цитата Сообщение от nmcf Посмотреть сообщение
DMA - это когда видеокарта (например) обращается к ОЗУ минуя процессор. Я что-то упустил?
в частности да
как это можно использовать в 80х86( там действительно нет память- память)
в современных видеокартах памяти не меньше чем на мамке
вариант первый буфер данных разместить в видеокарте, там кстати и память шустрее
одной посылкой копируем из памяти в видеокарту, второй с видеокарты в память, но уже в другое место
второй вариант нужные данные держать на видеокарте
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
нет ли в SDRAM какого
нет
память ничего сама не может, все снаружи делать приходится, даже помогать не забыть

Добавлено через 1 минуту
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Дело в том, что копирование идёт через процессор, то есть ячейка памяти заносится регистры процессора, а оттуда обратно в по нужному адресу отправляется. А сдвиг - это без процессора,
Это и есть DMA только на 80х86 нет команды память память
0
Заблокирован
30.10.2014, 20:10  [ТС] 19
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
грубо говоря как при битовом сдвиге >>
ТФУ ТЫ, а битовый сдвиг разве не то, что я ищу
Можно ли применить битовый сдвиг не к отдельной переменной, а к блоку памяти, допустим к int* data = new int[100] за одну команду ?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
30.10.2014, 20:10 20
одной посылкой копируем из памяти в видеокарту, второй с видеокарты в память
Ну так видеокарта это и делает.
0
30.10.2014, 20:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 20:10
Помогаю со студенческими работами здесь

Каков самый быстрый способ узнать количество строк в оргомном текстовом файле в Windows?
Есть текстовый файл с кучей строк (размер файла ~ 1Гб). Как можно максимально быстро узнать кол-во...

Наиболее быстрый способ сортировки файла в 1 Тб при ограниченном объёме оперативной памяти
Привет! Какой есть наиболее быстрый способ сортировки файла, содержащего int-ы (по одному int-у на...

Самый быстрый способ склеивания строк
Закешировал файл в строку, десериализовал данные в массив экземпляров специально созданного класса....

Какой способ рисования самый быстрый?
Вот нашел интересный код рисования на WinApi, переводил с языка С++: procedure...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru