【发布时间】:2015-05-27 06:52:57
【问题描述】:
我不知道我对 AVX 内在函数如何与 std::array 一起工作的理解是否缺少某些东西,但是当我将两者结合起来时,我遇到了一个奇怪的 Clang 问题。
示例代码:
std::array<__m256, 1> gen_data()
{
std::array<__m256, 1> res;
res[0] = _mm256_set1_ps(1);
return res;
}
void main()
{
auto v = gen_data();
float a[8];
_mm256_storeu_ps(a, v[0]);
for(size_t i = 0; i < 8; ++i)
{
std::cout << a[i] << std::endl;
}
}
Clang 3.5.0 的输出(上面的 4 个浮点数是垃圾数据):
1 1 1 1 8.82272e-39 0 5.88148e-39 0
GCC 4.8.2/4.9.1 的输出(预期):
1 1 1 1 1 1 1 1
如果我将v 作为输出参数传递给gen_data,它在两个编译器上都可以正常工作。我愿意接受这可能是 Clang 中的一个错误,但我不知道这是否是未定义的行为(UB)。使用 Clang 3.7* (svn build) 和 Clang 进行测试现在似乎给出了我预期的结果。如果我切换到 SSE 128 位内在函数 (__m128),那么所有编译器都会给出相同的预期结果。
所以我的问题是:
- 这里有 UB 吗?还是这只是 Clang 3.5.0 中的一个错误?
- 我对 __m256 只是一个 32 字节对齐的内存块的理解是否正确?还是有什么特别之处需要我小心处理?
【问题讨论】:
标签: c++ clang intrinsics avx