_mm256_movemask_epi8 至 uint64_t
_mm256_movemask_epi8 to uint64_t
谁能解释一下为什么 tr2 和 tr4 显示不同的结果:
auto test1 = _mm256_set1_epi8(-1);
uint64_t tr2 = _mm256_movemask_epi8(test1);
uint32_t tr3 = _mm256_movemask_epi8(test1);
uint64_t tr4 = tr3;
_mm256_movemask_epi8(test1) 应该 return int32,因此将其分配给 int64 应该只分配低位。
相反,tr2 打印 0xFFFFFFFFFFFFFFFF 并且 tr4 打印 0x00000000FFFFFFFF
做成tr4有没有性能?
我对 C++ 和内在函数都不熟悉,所以我可能遗漏了一些明显的东西。
我正在使用 Visual Studio 2019 C++ 编译器。
正如上面保罗所说,这与分配 signed/unsigned 更大的整数有关。这是一个例子:
#include <iostream>
#include <iomanip>
int main()
{
int32_t negInt = -1;
uint32_t unInt = static_cast<uint32_t>(negInt);
int64_t negBigInt = static_cast<int64_t>(negInt);
uint64_t unBigInt = static_cast<uint64_t>(negInt);
uint64_t fromUnsigned = static_cast<uint64_t>(unInt);
std::cout << std::hex;
std::cout << "0x" << std::setfill('0') << std::setw(16) << negInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << unInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << negBigInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << unBigInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << fromUnsigned << "\n";
}
这会打印:
0x00000000ffffffff
0x00000000ffffffff
0xffffffffffffffff
0xffffffffffffffff
0x00000000ffffffff
所以 Paul 是对的,但值得注意的是,如果您将 signed 数字分配给更高位宽的字段,则不会发生这种情况。
谁能解释一下为什么 tr2 和 tr4 显示不同的结果:
auto test1 = _mm256_set1_epi8(-1);
uint64_t tr2 = _mm256_movemask_epi8(test1);
uint32_t tr3 = _mm256_movemask_epi8(test1);
uint64_t tr4 = tr3;
_mm256_movemask_epi8(test1) 应该 return int32,因此将其分配给 int64 应该只分配低位。
相反,tr2 打印 0xFFFFFFFFFFFFFFFF 并且 tr4 打印 0x00000000FFFFFFFF
做成tr4有没有性能?
我对 C++ 和内在函数都不熟悉,所以我可能遗漏了一些明显的东西。
我正在使用 Visual Studio 2019 C++ 编译器。
正如上面保罗所说,这与分配 signed/unsigned 更大的整数有关。这是一个例子:
#include <iostream>
#include <iomanip>
int main()
{
int32_t negInt = -1;
uint32_t unInt = static_cast<uint32_t>(negInt);
int64_t negBigInt = static_cast<int64_t>(negInt);
uint64_t unBigInt = static_cast<uint64_t>(negInt);
uint64_t fromUnsigned = static_cast<uint64_t>(unInt);
std::cout << std::hex;
std::cout << "0x" << std::setfill('0') << std::setw(16) << negInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << unInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << negBigInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << unBigInt << "\n";
std::cout << "0x" << std::setfill('0') << std::setw(16) << fromUnsigned << "\n";
}
这会打印:
0x00000000ffffffff
0x00000000ffffffff
0xffffffffffffffff
0xffffffffffffffff
0x00000000ffffffff
所以 Paul 是对的,但值得注意的是,如果您将 signed 数字分配给更高位宽的字段,则不会发生这种情况。