std::AVX内部函数数组
std::array of AVX intrinsics
我不知道我对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个浮点为垃圾数据):
11.1.1.8.82272e-3905.88148e-390
GCC 4.8.2/4.9.1的输出(预期):
11.1.1.1.1.1.1
如果我将v
作为输出参数传递给gen_data
,那么它在两个编译器上都可以正常工作。我愿意接受这可能是Clang中的一个错误,但我不知道这是否是未定义的行为(UB)。Clang 3.7*(svn构建)和Clang的测试现在似乎给出了我预期的结果。如果我切换到SSE 128位内部函数(__m128
),那么所有编译器都会给出相同的预期结果。
所以我的问题是:
- 这里有UB吗?或者这只是Clang 3.5.0中的一个错误
- 我对__m256只是一个32字节对齐的内存块的理解正确吗?或者它还有什么特别的地方需要我小心吗
这看起来像是clang错误,现在已经修复,我们可以从这个错误报告中看到这一点,它演示了使用常规数组时的一个非常相似的问题。
假设std::array
实现类似于以下内容的存储:
T elems[N];
CCD_ 6和CCD_。其中一条评论说:
然而,libc++的
std::array<__m256i, 1>
在任何优化级别上都不起作用。
错误报告实际上是基于这个SO问题:用__m256值的数组生成错误的代码是clang错误吗?这是非常相似的,但是处理规则数组的情况。
错误报告包含一个可能的解决方案,OP表示这就足够了:
在我的实际代码中,
num_vectors
是基于simd_pack
类型的一些C++模板参数计算的。在许多情况下,这是1,但它也经常大于1。不过,你的观察给了我一个想法;我可以尝试引入一个模板专门化来捕捉num_vectors == 1
的情况。它可以只使用一个__m256
成员,而不是大小为1的数组。我得检查一下这有多可行。
- C++从函数指针数组调用函数
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 节点插件 API 将数组作为函数参数传递
- 将字符串数组作为函数参数传递
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- C++返回反向字符数组的函数
- 类数组插入函数
- 使用数组数组调用 C++ 函数
- 在 c++ 中将数字转换为矢量数组的函数
- 为什么我的数组或函数不起作用?
- 在C++中传递数组作为函数参数的方法
- 在std::数组内部使用时,无法从std::函数构造类
- 如何使用同时设置计数和填充数组的函数
- 模板 使用数据数组调用函数时扩展参数包
- 可以采用不同维度数组的函数
- 将 2D 数组作为函数参数,并返回 2D 数组作为函数的返回类型
- 如何使填充数组的函数发送到函数?而不是其参数中的数组
- 巨大的静态数组与函数内的本地数组
- 使用 memcpy 在数组内部复制的 C++
- 指针阵列在一个对象数组中函数