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

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

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

Студворк — интернет-сервис помощи студентам
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2014, 18:45
Ответы с готовыми решениями:

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

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

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

50
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
30.10.2014, 20:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Можно ли применить битовый сдвиг не к отдельной переменной, а к блоку памяти, допустим к int* data = new int[100] за одну команду ?
нет
0
Заблокирован
30.10.2014, 20:15  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
Это и есть DMA только на 80х86 нет команды память память
Слушай, а на видокартах nVidia такое есть? То есть если посмотреть на CUDA, там есть функция копирования памяти:
C++
1
2
3
4
5
cudaError_t cudaMemcpy  (   void *  dst,
const void *    src,
size_t  count,
enum cudaMemcpyKind     kind     
)
Последний параметр может принимать значение: cudaMemcpyDeviceToDevice, то есть копирование из памяти GPU опять же в память GPU... Это как происходит? Тоже не как бы в памяти, а через уже графический процессор, так? Но если даже так, это наверное намного быстрее нежели копировать так же системную память через CPU ?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
30.10.2014, 20:19
могу предложить такой вариант, в рамках языка
допустим тебе нужен буфер из 10 ячеек, выделяем 20

C++
1
2
3
4
5
6
7
8
int arr[20];
for(int i=0;i<10;i++)
 arr[i]=arr[i+10]=i;
 
int* Shift(int* a)
{
return a++;
}
предусмотреть нужно чтобы указатель дойдя до десятого элемента, сбрасывался на нулевой

Добавлено через 1 минуту
никаких копирований но памяти в два раза больше
1
Заблокирован
30.10.2014, 20:26  [ТС]
ValeryS, так что на счёт копирования видео памяти в видео память ?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
30.10.2014, 20:30
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Чтоб блок памяти сдвинуть?
Что такое "сдвинуть"? Скопировать из одного места в другое, неперекрывающееся? Скопировать из одного места в другое, перекрывающееся? Сделать циклический/нециклический сдвиг байтов в рамках одного блока? Сделать циклический/нециклический сдвиг битов в рамках одного блока? Что-то другое?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.10.2014, 20:33
так что на счёт копирования видео памяти в видео память
Там тоже самое, только размер блока больше.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
30.10.2014, 20:36
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
ValeryS, так что на счёт копирования видео памяти в видео память
конкретно не готов ответить
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть если посмотреть на CUDA
не работал, все знания мои еще со времен ДОС, а более предметно изучать сейчас времени нет
0
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
30.10.2014, 20:37
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Можно ли применить битовый сдвиг не к отдельной переменной, а к блоку памяти, допустим к int* data = new int[100] за одну команд
Ну даже и 4 байта нельзя сдвинуть чтобы заместились следущие 4 байта и тд....
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
30.10.2014, 20:46
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

При чём тут DMA, CUDA и видеопамять, если речь идёт конкретно об RAM ПК, с которой и работает пример из первого поста?

GCC. x86. Почти идеальный вариант (как было сказано выше через rep movsd):
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
#include <cstdio>
#include <cstdint>
 
int main()
{
    int * p = new int [100];
 
    printf( "Before:\n" );
    for ( size_t i = 0, j = 1; i < 100; ++i, ++j ) {
        p[i] = i;
        printf( " %4d", p[i] );
        if ( j >= 20 ) {
            printf( "\n" );
            j = 0;
        }
    }
    printf( "\n" );
 
    __asm__ __volatile__ (
    "   .intel_syntax       \n"
    "   rep     movsd       \n"
    "   .att_syntax         \n"
        : : "S" (p), "D" (p + 50), "c" (50) : "eax" );
 
    printf( "After:\n" );
    for ( size_t i = 0, j = 1; i < 100; ++i, ++j ) {
        printf( " %4d", p[i] );
        if ( j >= 20 ) {
            printf( "\n" );
            j = 0;
        }
    }
    printf( "\n" );
 
    delete [] p;
}
"Почти" означает что при определенных обстоятельствах можно ускорить данный процесс "развернув" цикл.

Не по теме:

-THE_MASTER666-, а тебе не кажется, что ты лезешь в недостижимые на данный момент для тебя дебри? Ведь ты же даже толком и не знаешь что тебе нужно.

0
Заблокирован
30.10.2014, 20:59  [ТС]
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
Ну даже и 4 байта нельзя сдвинуть чтобы заместились следущие 4 байта и тд....
Если у тебя поле данных - 4 байта, то внутри него ты можешь сдвигать два байта свободно битовым сдвигом
Вот если б такое было для больших блоков памяти... А ток то, всего 4 байта, ну или 8 в случае х64, что ясен пень связанно с размером регистров процессора.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Скопировать из одного места в другое, неперекрывающееся?
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
ся? Скопировать из одного места в другое, перекрывающееся?
Не важно, будет перекрытие или нет, главное чтоб это было не копирование, а сдвиг.

Ну вот представьте себе поезд на рельсах, длинной в один перрон. Он припаркован на перроне и занимает всю его длину. Я подошёл к поезду сзади и пнул его ногой (я супер мэн) и поезд покатился по рельсам и допусти остановился тогда, когда только что ушёл с перрона, вот он и сдвинулся на длину своего состава, то есть он сдвинулся. А вот если б он скопировался, тогда бы ситуация была следующей: На участке за перроном прибегает бригада инженеров со сварщиками и начинает там собирать там поезд прямо на рельсах, когда соберут, они могут даже разобрать первый поезд (обнулить), если потребуется. Но всё это долго, гораздо быстрее его просто сдвинуть.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
а тебе не кажется, что ты лезешь в недостижимые на данный момент для тебя дебри? Ведь ты же даже толком и не знаешь что тебе нужно.
не кажется, т.к. то что мне нужно, я прекрасно знаю, все вопросы возникают в связи с рассмотрением разных концепций реализаций на железках.



Добавлено через 3 минуты
castaway, спасибо за пример, поизучаю (почему то спасибо сказать нельзя). Сейчас времени уже нет - ушёл.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
30.10.2014, 21:06
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Если у тебя поле данных - 4 байта, то внутри него ты можешь сдвигать два байта свободно битовым сдвигом
покажь

если ты имеешь ввиду регистр процессора то к памяти это отношения не имеет
для того чтобы сдвинуть в памяти нужно считать в регистр, сдвинуть и записать обратно в память
итого
1 чтение
2 модификация
3 запись
что больше чем просто копирование
1 чтение
2 запись
а уж тем более чем чтение/ запись одной командой movsd
1
Заблокирован
30.10.2014, 21:31  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
GCC. x86. Почти идеальный вариант (как было сказано выше через rep movsd):
#include <cstdio>
#include <cstdint>
int main()
{
* * int * p = new int [100];
добавлю лишь, что на MSVS всё намного проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__movsd)
 
int main()
{
    unsigned long a1[10];
    unsigned long a2[10] = { 950, 850, 750, 650, 550, 450, 350,
        250, 150, 50 };
    __movsd(a1, a2, 10);
 
    for (int i = 0; i < 10; i++)
        printf_s("%d ", a1[i]);
    printf_s("\n");
}
В MSVS вообще много специфичных штуковин __movsd, __asm и тд ))
__movsd(a1, a2, 10); - эта штука сама строку формирует, которую ты вручную вбивал
0
30.10.2014, 21:42

Не по теме:

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
добавлю лишь, что на MSVS всё намного проще
Ну и замечательно. Я очень рад за MSVS/

0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.10.2014, 22:13
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

А с какой целью делается сдвиг памяти? А то вполне возможно, что проблема вовсе не в сдвиге, а в алгоритме, который требует сдвигать память. А если всё-таки нужно двигать память, то можно выдрать исходники memmove/memcpy из glibc

Добавлено через 2 минуты
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Но всё это долго, гораздо быстрее его просто сдвинуть
Скопировать быстрее. Аналогия с поездом вообще не в кассу
1
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
30.10.2014, 22:29
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
ты можешь сдвигать два байта свободно битовым сдвигом
Как бы я за 4 говорил.

Добавлено через 5 минут
Цитата Сообщение от Evg Посмотреть сообщение
А с какой целью делается сдвиг памяти? А то вполне возможно, что проблема вовсе не в сдвиге, а в алгоритме, который требует сдвигать память. А если всё-таки нужно двигать память, то можно выдрать исходники memmove/memcpy из glibc
Он просто хочет сделать копирование с одного места на другое, быстрее чем есть, и придумал двигать память мол это будет быстрее, но память то не подвигаешь.
0
Заблокирован
30.10.2014, 22:31  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
А с какой целью делается сдвиг памяти?
с целью ускорения рекомбинирования структуры блоков в выделенном поле памяти...
Отдалённо это похоже на дефрагментацию HDD.
Ладно, нет шифта, ну и ладно... Всем спасибо
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.10.2014, 22:32
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
Он просто хочет сделать копирование с одного места на другое, быстрее чем есть, и придумал двигать память мол это будет быстрее, но память то не подвигаешь
Двигать или копировать - разницы нет. Просто хочется понять, для каких целей младшую половину массива нужно скопировать в старшую половину (или наоборот - неважно)

Добавлено через 45 секунд
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
с целью ускорения рекомбинирования структуры блоков в выделенном поле памяти...
По отдельности все слова знаю, но итоговую мысль не осилил
0
Заблокирован
30.10.2014, 22:40  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
По отдельности все слова знаю, но итоговую мысль не осилил
вот, собственно суть на скрине
Миниатюры
Memory shift или самый быстрый способ перемещения блока памяти  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.10.2014, 22:54
Тогда задам следующий вопрос, который будет вполне очевидным и до банальности идиотским: а зачем?

Не по теме:

Сразу вспомнился анекдот. Сидит негр в norton commander'е, поёт "i like to move it move it" и нажимает F6-Tab-F6-Tab...

1
Заблокирован
30.10.2014, 23:06  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
а зачем?
Писал долго...потом понял, что всё равно объяснять ещё дольше и стёр весь текст

У меня тут есть вопрос по этой дефрагментации:
1. В SDRAM в плане скорости чтения / записи есть разница между чтением блоков одинаково размера из случайных позиций в адресном пространстве памяти или же из последовательной цепочки?
Не то есть если я читаю просто рандомом какие - то ячейки памяти, у меня скорость одна (Synchronous Dynamic Random Access Memory - собственно и создан для рандом аксеса), но вот вопрос, быстрее будет произведено чтение, если я буду читать ровно столько же блоков памяти и ровно такого же размера, в случае, если они в адресном пространстве расположены один за другим поровозиком ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2014, 23:06

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

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

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

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

Какой способ рисования самый быстрый?
Вот нашел интересный код рисования на WinApi, переводил с языка С++: procedure TForm1.Button1Click(Sender: TObject); var hMemDC:HDC;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru