У меня есть две следующие ситуации, которые для меня должны быть похожими, но, по-видимому, нет.
Эта не работает, хотя это было бы более идеальным:
static union { __m256 trueMask8; float trueMask[8]; };
void Init()
{
trueMask8 = _mm256_cmp_ps(_mm256_setzero_ps(), _mm256_setzero_ps(), _CMP_EQ_OS);
}
class Ray8
{
union { __m256 activeMask8; float deadMask[8]; };
Ray8()
{
activeMask8 = trueMask8;
int w = 0; //breakpoint
}
}
Проблема с вышеупомянутым состоит в том, что activeMask8 показывает все 0 на точке останова, в то время как trueMask8 показывает все -nan, поэтому я уверен, что Init был вызван. каждый раз, когда мне нужна настоящая маска, мне нужно вызывать сравнение:
class Ray8
{
union { __m256 activeMask8; float deadMask[8]; };
Ray8()
{
activeMask8 = _mm256_cmp_ps(_mm256_setzero_ps(), _mm256_setzero_ps(), _CMP_EQ_OS);
int w = 0; //breakpoint
}
}
Здесь все в activeMask8 равно -1 в точке останова.
То же самое касается:
activeMask[0] = trueMask[0];
Это два числа с плавающей точкой. trueMask [0] показывает -nan, тогда как activeMask [0] впоследствии показывает 0.
Почему это происходит? Обычно я пытаюсь создать конструктор копирования, но _m256 - это тип библиотеки. Есть ли решение для этого?