MSVC v143 x86平台/_mm256_setr_epi64x/编译错误结果求助
EDIT2:我进一步简化了测试用例并优化了测试代码
这个问题我研究了一周,大概率是编译器BUG,但无法完全确定。
我使用CMake搭配MSVC-19.37.32822.0,target_compile_options设为/arch:AVX(/arch:AVX2同样触发问题),target_compile_features设为cxx_std_20。
_mm256_setr_epi64x和_mm256_set_epi64x这两个intrinsics生成错误结果。Debug构建无此问题,g++、clang++、clang-cl在所有SIMD选项组合下也正常。
该问题仅出现在开启/arch:AVX或/arch:AVX2的x86 MSVC构建中。用/O1和/O2编译可修复问题,仅Release模式出现,是可行方案! 经测试该方案无效。
我仅测试了最新v143工具集(MSVC-19.37.32822.0),未尝试旧版本。
EDIT:
该问题复现难度超预期——Godbolt无法用MSVC编译器运行测试。初步判断与Catch2测试框架相关。我已搭建GitHub复现仓库,含跨平台CMake配置可稳定复现,仓库会自动拉取Catch2。克隆后用VS2022打开CMakeLists.txt即可使用。
以下是复现测试代码片段:
/// FAILS TEST_CASE("Testing with GIVEN", "[bug]") { const int64_t values[4] {11, 22, 33, 0}; GIVEN("a1") { const __m256i a1 = _mm256_setr_epi64x( values[0], values[1], values[2], 0 // 如果换成values[3]就能正常运行 ); WHEN("a1 is stored") { alignas(32) int64_t b1[4]; _mm256_store_si256(reinterpret_cast<__m256i*>(b1), a1); THEN("The result should be correct") { REQUIRE(b1[0] == values[0]); REQUIRE(b1[1] == values[1]); REQUIRE(b1[2] == values[2]); // 这里总是失败 REQUIRE(b1[3] == values[3]); } } } }
你可克隆仓库测试,我还添加了GitHub Actions工作流(登录GitHub可查看构建/测试日志)
我已在微软开发者社区提交对应BUG报告,仍希望在此获取更多信息。
内容的提问来源于stack exchange,提问作者Dimo Markov
相关产品推荐
相关产品推荐

