Итак, я все еще изучаю побитовые операции и не могу понять, почему происходит эта ошибка. Я гуглил его, и кажется, что эта ошибка может возникнуть при работе со стеком, или, в некоторых случаях, это связано с архитектурой процессора. Я пытался скомпилировать с различными флагами, которые должны были помочь, но я не могу заставить его работать.
Вот код быстро:
int corners = 0;
for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
const float density = Density_Func(vec3(cornerPos));
const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
corners |= (material << i);
}
И ошибка «Недопустимая инструкция (ядро сброшено)» происходит на линии
corners |= (material << i);
Вот вывод отладчика:
Signal received: SIGILL (Illegal instruction) For program, pid 26,118
Я собираюсь дать вывод этого цикла (он никогда не проходит через первый цикл).
Вот код для кроваток:
int corners = 0;
std::cout<<"corners(outside loop): "<<corners<<std::endl;
for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
std::cout<<"cornerPos.x: "<<cornerPos.x<<std::endl;
std::cout<<"cornerPos.y: "<<cornerPos.y<<std::endl;
std::cout<<"cornerPos.z: "<<cornerPos.z<<std::endl;
const float density = Density_Func(vec3(cornerPos));
std::cout<<"density: "<<density<<std::endl;
const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
std::cout<<"material: "<<material<<std::endl;
std::cout<<"MATERIAL_SOLID: "<<MATERIAL_SOLID<<std::endl;
std::cout<<"MATERIAL_AIR: "<<MATERIAL_AIR<<std::endl;
std::cout<<"i: "<<i<<std::endl;
corners |= (material << i);
std::cout<<"corners(inside loop): "<<corners<<std::endl;
}
и вот вывод:
[corners(outside loop): 0] [cornerPos.x: -32] [cornerPos.y: -32] [cornerPos.z: -32] [density: -30] [material: 1] [MATERIAL_SOLID: 1] [MATERIAL_AIR: 0] [i: 0]
Я был бы очень признателен за понимание того, почему это происходит, и, если есть четкая причина, как решить проблему.
Спасибо!
«Недопустимая инструкция» означает, что процессор пытался выполнить инструкцию, которая не понимает. Это может произойти, если вы компилируете свою программу с набором инструкций, который не поддерживается вашим процессором. Сбой в этом месте может указывать на то, что использовалась команда сдвига битов BMI2 (она поддерживается на процессорах, которые также поддерживают AVX2). Пожалуйста, проверьте параметры компиляции.
Другая возможность состоит в том, что ваша программа перезаписала часть своего кода. Он расположен не в стеке, а в другой области памяти, так что все будет очень запутано. Я подозреваю, что это не тот случай.
Это может также быть вызвано перегревом или некоторой ошибкой процессора, но эти причины, скорее всего, и здесь могут быть исключены. То же самое для возможной ошибки в компиляторе.
Других решений пока нет …