Проверка значений матрицы во вложенных циклах - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь проверить значения матрицы во вложенном цикле для модульных тестов.Тесты проходят на macOS (clang), но дают сбой Ubuntu 18.04 (gcc версия 7.3.0).

Вот что я пытаюсь сделать (я пытаюсь проверить результат (m3) - это личностьmatrix):

mat3  m1 = GLM_MAT3_IDENTITY_INIT;
mat3  m2 = GLM_MAT3_IDENTITY_INIT;
mat3  m3;

int i, j, k;

/* test identity matrix multiplication */
glm_mat3_mul(m1, m2, m3);

for (i = 0; i < 3; i++) {
  for (j = 0; j < 3; j++) {
    if (i == j) {
      assert_true(glm_eq(m3[i][j], 1.0f));
    } else {
      assert_true(glm_eq(m3[i][j], 0.0f));
    }
  }
}

Это не работает в Ubuntu / gcc, но проходит в macOS.Если я использую volatile в переменной i , то она также передается в Ubuntu:

mat3  m1 = GLM_MAT3_IDENTITY_INIT;
mat3  m2 = GLM_MAT3_IDENTITY_INIT;
mat3  m3;

volatile i;
int      j, k;

/* test identity matrix multiplication */
glm_mat3_mul(m1, m2, m3);

for (i = 0; i < 3; i++) {
  for (j = 0; j < 3; j++) {
    if (i == j) {
      assert_true(glm_eq(m3[i][j], 1.0f));
    } else {
      assert_true(glm_eq(m3[i][j], 0.0f));
    }
  }
}

, если я печатаю значения i и j перед оператором if (i == j) { без volatile, тоэто также проходит.Возможно i кэшируется и новое значение i не загружается на следующей итерации.Но это также будет верно для mat4 тестов, тот же тест работает для mat4

Использование одного условия (истинное условие или ложное условие) приводит к прохождению теста, но с использованиемв противном случае тест завершается неудачно.

Я использую cmocka для тестирования и запускаю команду make check для запуска тестов.

mat3 и mat4 определения:

typedef float                   vec2[2];
typedef CGLM_ALIGN_IF(8)  float vec3[3];
typedef int                    ivec3[3];
typedef CGLM_ALIGN_IF(16) float vec4[4];

#ifdef __AVX__
typedef CGLM_ALIGN_IF(32) vec3  mat3[3];
typedef CGLM_ALIGN_IF(32) vec4  mat4[4];
#else
typedef                   vec3  mat3[3];
typedef CGLM_ALIGN_IF(16) vec4  mat4[4];
#endif

Должен ли я использовать volatile здесь?Или что не так с моими тестовыми кодами?

PS: Тот же тест проходит для mat4 в Ubuntu, он не работает только для mat3

РЕДАКТИРОВАТЬ:

Значения с плавающей точкой сравниваются с использованием glm_eq(a, b):

CGLM_INLINE
bool
glm_eq(float a, float b) {
  return fabsf(a - b) <= FLT_EPSILON;
}
...