Перейти к содержанию
    

C, GCC. Компилятор выбрасывает код при оптимизации

4 часа назад, repstosw сказал:

Это точно, что в этих случаях каждый элемент массива будет volatile? Или только имя массива?

100%

4 часа назад, repstosw сказал:

Для DSP барьер памяти :  memw,   для CPU - инструкция DSB

У Cortex-M аж три CPU инструкций барьеров: DMB, DSB, ISB.

В Вашем, думаю, около того же...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/18/2023 at 4:05 AM, repstosw said:

Они тормозят ядро? 

время на синхронизацию конечно требуется, в мануале написано так

Quote

Lock time of the processor is predictable (less than 200 cycles)

 

On 10/18/2023 at 4:05 AM, repstosw said:

Тогда не подходит.  То, что флаг установился/сбросился, это ещё недостаточно, чтобы тормозить ядро. Потому что оно кроме этого ещё некоторые вещи делает.

вообще не очень понятно как вам может подойти ядро которое считает в несколько раз медленней судя по вашим тестам и при этом вы будете поллить результат на более быстром ядре. В чём смысл ? Я бы ещё понял что считается параллельно пока CPU что-то делает другое полезное и прерывается по готовности результата аппаратно.

Кстати а сброс кеша по вашему мгновенный ?

Quote
  cache_flush_range((u32)RSC,((u32)RSC)+fsize);

или это другое 🙂

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, repstosw сказал:

Это точно, что в этих случаях каждый элемент массива будет volatile? Или только имя массива?

Имя массива не может быть volatile. Как и имя любой другой переменной. Оно имя. volatile относится к содержимому переменной/массива.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, sasamy said:

вообще не очень понятно как вам может подойти ядро которое считает в несколько раз медленней судя по вашим тестам и при этом вы будете поллить результат на более быстром ядре. В чём смысл ? Я бы ещё понял что считается параллельно пока CPU что-то делает другое полезное и прерывается по готовности результата аппаратно.

ARM CPU 0 - кодер Рида-Соломона.  34 FPS

ARM CPU 1 - декодер Рида-Соломона 15 FPS

HiFI4 DSP - главная программа +  JPEG encoder/decoder(аппаратно), CELT coder/decoder (софтово), эхоподавитель(софтово), G2D(аппаратно), захват с камеры(аппаратно),  ADC/DAC(аппаратно).

Сделал HiFi4 DSP главным, потому что Рида-Соломона он не вывозит на 12 FPS.   Зато на остальное его хватает.  Нужно одновременно кодирование и декодирование на 12..15 FPS.

34 FPS + 15 FPS = 10.4 FPS < 12..15 FPS

Итого: все ТРИ ядра активны.

 

5 hours ago, Сергей Борщ said:

Имя массива не может быть volatile. Как и имя любой другой переменной. Оно имя. volatile относится к содержимому переменной/массива.

А если указатель volatile? Что в этом случае что изменчиво - само значение указателя (адрес) или содержимое памяти (при разыменовывании) , на которое указывает этот указатель?

 

5 hours ago, sasamy said:

Кстати а сброс кеша по вашему мгновенный ?

Quote
  cache_flush_range((u32)RSC,((u32)RSC)+fsize);

или это другое 🙂

И сколько времени надо ждать, прежде чем другое ядро сможет обращаться к этим данным?

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 минут назад, repstosw сказал:

А если указатель volatile? Что в этом случае что изменчиво - само значение указателя (адрес) или содержимое памяти (при разыменовывании) , на которое указывает этот указатель?

Если сам указатель volatile, то, естественно, с точки зрения компилятора "изменчив" будет только он, а не то, куда он показывает.

u32 volatile *p = (какой-то адрес); // указатель на volatile: например, периферийный регистр

u32 *volatile p = (какой-то адрес); // вот этот вот "какой-то адрес" нельзя оптимизировать; например, ISR "двигает" позиции программного FIFO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/18/2023 at 2:18 PM, repstosw said:

Сделал HiFi4 DSP главным

тогда понятно

On 10/18/2023 at 2:18 PM, repstosw said:

И сколько времени надо ждать, прежде чем другое ядро сможет обращаться к этим данным?

нисколько, с двумя разнородными ядрами вам надо постоянно синхронизировать кеши с памятью на разных ядрах и это ненулевые задержки - этого не нужно если бы всё делать на arm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, sasamy сказал:

этого не нужно если бы всё делать на arm

Или (в качестве shared memory) использовать внутреннюю ОЗУ. Доступную всем ядрам. Без всяких кешей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:
u32 volatile *p = (какой-то адрес); // указатель на volatile: например, периферийный регистр

u32 *volatile p = (какой-то адрес); // вот этот вот "какой-то адрес" нельзя оптимизировать; например, ISR "двигает" позиции программного FIFO

Какой из ваших двух примеров будет означать буфер с изменчивыми данными?   Нужен буфер с volatile-содержимым.  Статический массив не подходит, потому что длина может меняться.

Указатель на массив - тоже не годится : потому что надо указывать размер: 

char (*mem)[256];

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, repstosw сказал:

Какой из ваших двух примеров будет означать буфер с изменчивыми данными?   Нужен буфер с volatile-содержимым.  Статический массив не подходит, потому что длина может меняться.

u32 volatile *..., т.е. указатель на volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/18/2023 at 1:21 AM, Сергей Борщ said:
int volatile * volatile pd; // volatile-указатель на volatile-int

Шедевр! Никогда не встречал такой конструкции.

 

On 10/18/2023 at 10:50 PM, jcxz said:

Или (в качестве shared memory) использовать внутреннюю ОЗУ. Доступную всем ядрам. Без всяких кешей.

У Allwinner можно закешировать SRAM A1 и не только.  И она быстрее работает. Хотя по логике вещей скорость не должна была измениться (как у того же TMS320C6745)

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 минут назад, repstosw сказал:

У Allwinner можно закешировать SRAM A1 и не только.  И она быстрее работает.

Ну так - не кешировать её. Зачем кешировать расшаренную память, используемую для межъядерного обмена? Выигрыш - копейки (или вообще нет), а проблем сами же себе создаёте вагон.

PS: В OMAP-L137 для межъядерного обмена я использовал L2-RAM. И мне даже в голову не приходила мысль кешировать её.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, jcxz said:

Ну так - не кешировать её. Зачем кешировать расшаренную память, используемую для межъядерного обмена? Выигрыш - копейки (или вообще нет), а проблем сами же себе создаёте вагон.

Что определяет расшаренную память?   Мануал на контроллер или бит SHARED в MMU ?  Вопрос в контексте Cortex A7.  Конкретнее T113-s3.

 

В мануале перечислены адреса памяти.  Некоторые адреса подключены к Internal Bus DSP, от того и быстрые.  Может ли она быть SHARED?  Для ARM CPU

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, repstosw сказал:

Что определяет расшаренную память?

Программист. "расшаренная" - используемая совместно ядрами, для межъядерного обмена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...