Ошибки, баги, вопросы - страница 2506

 
Vict:

Опять мимо, все развивается, все больше упор делается на многопоточность, и вот вам пожалуйтса - крестовая стд библиотека вам всё расскажет

https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size

Возможно, но пока вы меня не убедили.

Не подскажет, а нагадает. Внимательно читаем спецификацию.


Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.

 
Artyom Trishkin:

Если нет значения в буфере на баре, то это нужно явно прописать в буфере. Т.е., если рассчитанное значение должно быть выведено в буфер - записываем его в буфер, иначе - записываем пустое значение.

Спасибо, Артем.

[Удален]  
Francuz:

Хоть я не совсем понял, что за смещение вы хотели получить, но понять косяк просто: абсолютный адрес полностью бесполезен в вычислениях. Вы забыли что точкой отсчёта для памяти является адрес структуры? И вы наверное хотели получить смещение массива в блоке памяти структуры? А это получается разницей адресов структуры и нулевого элемента массива.

int index = int(CACHE_LINE_SIZE - getaddr(data[rndnum].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
                                3        1                    2                  4

Действия по порядку:

1 - получаем адрес первого эл-та ar[] в текущей структуре data.

2. узнаём его смещения от начал кэш-линии

3. находим кол-во байт от него до конца кэш-линии

4. узнаём кол-во интов, которые вместятся в это пространство до конца кэш-линии.


Вы у себя запускали? Разница в скорости есть? Или это лишь у меня?

 
Vict:

2. узнаём его смещения от начал кэш-линии

С чего вы взяли что так можно определить какое-то смещение?

 
От чего эти тормоза?
 
fxsaber:
От чего эти тормоза?
у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов
 
Vict:

Довёл до ума первоначальную идею (в первом коде неправильно считал адреса). Если не затруднит, то интересно будет посмотреть на результат у вас.

Разброс сильный от запуска к запуску, разницы постоянной в чью-то сторону не видно. Конечно, запускаю Release-вариант.

#define WRONG_ALIGNED
#define CACHE_LINE_SIZE 64

struct Data {
#ifdef WRONG_ALIGNED
   ushort pad;
#else
   uint pad;
#endif
   uint ar[CACHE_LINE_SIZE/sizeof(int)+1];
};

#import "msvcrt.dll"
  long memcpy(uint &, uint &, long);
#import
#define getaddr(x) memcpy(x, x, 0)

void OnStart()
{
//   Data data[32768];
   Data data[];
  
   ArrayResize(data, 32768); // для не static-массива жуткие тормоза выходят. 
   ZeroMemory(data);
   
   ulong start_time = GetMicrosecondCount();
   
   for(unsigned i = 0; i < 10000; ++ i) {
    for (int j = ArraySize(data) - 1; j >= 0; j--)
    {
         int index = int(CACHE_LINE_SIZE - getaddr(data[j].ar[0]) % CACHE_LINE_SIZE) / sizeof(int);
         ++ data[j].ar[index];
         ++ data[j].pad;
      }
   }
      
   Alert(GetMicrosecondCount() - start_time);
   
//   Print(data[100].ar[0]);
//   Print(data[100].pad);
}
 
TheXpert:
у динамического массива больше проверок, Ренат как-то писал, пост не найду, как раз в разговоре об обращении по индексу, почему существенно медленней плюсов

Получается, что при заполнении динамических массивов лучше сначала заполнять статические, а потом делать ArrayCopy в динамические.

 
fxsaber:
От чего эти тормоза?

Вы из статического сделали динамический массив. Отсюда все вытекающие проблемы типа:

int a[][100];
ArrayResize(a, 100);
ZeroMemory(a);

// Первый цикл
for(int i; i < 100; ++i)
{
        for(int n; n < 100; ++n)
        {
                a[i][n]++;
        }
}

// Второй цикл
for(int n; n < 100; ++n)
{
        for(int i; i < 100; ++i)
        {
                a[i][n]++;
        }
}

Когда первый и второй циклы работают с разной скоростью.

[Удален]  
fxsaber:

Спасибо. Странно, конечно. У меня стабильная разница.