Войти
ФлеймФорумПрограммирование

Летопись багов (10 стр)

Страницы: 19 10 11 1214 Следующая »
#135
17:52, 23 июля 2018

Нестыковка между референсной версией умножения матриц и SIMD.
Из кода референсной версии:

        v[0]=a[0]*m[ 0]+a[1]*m[ 1]+a[2]*m[ 2]+a[3]*m[ 3];
        v[1]=a[0]*m[ 4]+a[1]*m[ 5]+a[2]*m[ 6]+a[3]*m[ 7];
        v[2]=a[0]*m[ 8]+a[1]*m[ 8]+a[2]*m[10]+a[3]*m[11];
        v[3]=a[0]*m[12]+a[1]*m[13]+a[2]*m[14]+a[3]*m[15];


#136
18:24, 23 июля 2018

Я вот поэтому вместо 1, 5, 9, 13 пишу (1+0), (1+4), (1+8), (1+12). Или даже (1+0*4), (1+1*4), (1+2*4), (1+3*4).

#137
18:36, 23 июля 2018

Роман Шувалов
Я иногда тоже. Здесь и цикл можно было бы написать.

А и да, это умножение матрицы на вектор, а не двух матриц.

Забавно, что виден баг стал только с появлением отсечения по ближней/дальней плоскости. Экранные и текстурные координаты зависят только от x, y, w.

#138
18:40, 23 июля 2018

В смысле цикл ожидается, что компилятор сможет развернуть (4, фиксированный размер), а конкретно от этого типа багов - помогает.

Ещё занятно, что зачастую пишут референсную версию на чистом C и затем оптимизированную с использованием SIMD. В общем такая практика мне нравится, но замечаю, что в определённом классе случаев в референсной версии легче ошибиться, чем в оптимизированной.

#139
8:07, 30 июля 2018
static float vertices[6*6]={
    -10.0f,  0.0f,+10.0f,  1.0f,  0.0f,  0.0f,
    +10.0f,  0.0f,+10.0f,  1.0f,  1.0f,  0.0f,
    +10.0f,  0.0f,-10.0f,  1.0f,  1.0f,  1.0f,
    -10.0f,  0.0f,-10.0f,  1.0f,  0.0f,  1.0f  // BUG_HERE
    -10.0f,  0.0f,+10.0f,  1.0f,  0.0f,  0.0f,
    +10.0f,  0.0f,-10.0f,  1.0f,  1.0f,  1.0f,
};
В который раз на это напарываюсь, блин.
#140
9:47, 30 июля 2018

FordPerfect
Жесть какая... А компилятор разве не должен говорить, что количество инициализируемых элементов не равно размеру массива?

#141
(Правка: 14:26) 14:26, 30 июля 2018

Vlad2001_MFS
Когда больше - ругается (ошибка компиляции).
Когда меньше - молчит (видимо это слишком частая идиома, и много кода её юзает, float x[N]={0}; // Initialize with zeroes).
Если есть какая-то опция, как его заставить таки говорить - была бы к месту.

#142
14:43, 30 июля 2018

FordPerfect

static float vertices[]={...};
static_assert(6*6 == dimof(vertices))
#143
14:53, 30 июля 2018

FordPerfect
> float x[N]={0}; // Initialize with zeroes)
это вредная идиома на самом деле. На хабре было про то как некоторый компилятор при этом отдельно первый элемент инициализирует.
Надо float x[N]={};

#144
15:26, 30 июля 2018

kipar
> float x[N]={};
Вот только это в C++ зануляет, а в C - оставляет неинициализированным. Начальный нолик - именно для C (зануляют весь массив).

#145
15:29, 30 июля 2018

return [](){};
Конкретно здесь - работает (хотя больше текста). Но есть более муторные случаи. Тупо для многомерного массива - это поможет только внешней размерности.

#146
15:33, 30 июля 2018

FordPerfect
хах, первый раз слышу но походу да.
С другой стороны, мне кроме gcc ничего не надо, а он и с пустыми скобками зануляет.

#147
18:26, 14 авг. 2018
        if (total_data_uncompressed_bytes > 0) {
            // ...
        }
        else {
            // No data, remove empty file
            sprintf(s, "rm %s", gpak_filename);
            system(s);
        };
+ Ответ
#148
18:29, 20 авг. 2018

Бомба замедленного действия.

    game->smv_poi[ game->smv_poi_count ].pos = pos;
    game->smv_poi[ game->smv_poi_count ].radius = radius;
    game->smv_poi[ game->smv_poi_count ].status = 1;
    game->smv_poi_count++; 
#149
18:34, 20 авг. 2018

Роман Шувалов
рано или поздно потребовалось дописать строку и дописал ее после инкремента?

Страницы: 19 10 11 1214 Следующая »
ФлеймФорумПрограммирование