相当于m256_f32的海湾合作委员会
GCC equivalent for m256_f32
我有这样的AVX C++代码,在Visual Studio 2010下编译得很好:
#include <immintrin.h>
#include <iostream>
int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
float r0 = ymm0.m256_f32[0];
float r4 = ymm0.m256_f32[4];
std::cout << r0 << " " << r4 << std::endl;
}
但是,GCC 给出以下错误:
foo.cpp:8:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’
foo.cpp:9:18: error: request for member ‘m256_f32’ in ‘ymm0’, which is of non-class type ‘__m256 {aka __vector(8) float}’
我做了一些研究,似乎ymm0.m256_f32
是从长AVX寄存器中提取单个浮点数的Microsoft特定指令。但是我可以用什么让 gcc/linux 做同样的事情呢?
GCC可以用C语言索引向量,但不能用C++索引向量。您可以考虑将代码的小部分重写为 C。
另一种选择是显式使用随机播放、提取和转换内部函数 - _mm256_shuffle_pd
、_mm256_extractf128_pd
、_mm_cvtsd_f64
。
按照@chill,我想出了以下两个解决方案来解决这个特定问题。C++解决方案:
#include <immintrin.h>
#include <iostream>
int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
__m128 low = _mm256_extractf128_ps (ymm0, 0); // extracts lower half
__m128 high = _mm256_extractf128_ps (ymm0, 1);// extracts upper half
float r0 = _mm_cvtss_f32 (low); // extracts lowest float
float r4 = _mm_cvtss_f32 (high); // extracts lowest float
std::cout << r0 << " " << r4 << std::endl;
}
而普通 C 中的解决方案:
#include <immintrin.h>
#include <stdio.h>
int main() {
float data[] = {0, 1, 2, 3, 4, 5, 6, 7};
__m256 ymm0 = _mm256_loadu_ps(data);
// ..
float r0 = ymm0[0];
float r4 = ymm0[4];
printf("%f, %f", r0, r4);
}
相关文章:
- 用于AVX的ln(x)的实现,m256
- 海湾合作委员会 ARM 性能下降
- 海湾合作委员会手册中提到的"C++ ABI Specification"是什么?
- 比较 -INT_MIN (海湾合作委员会)
- 使用海湾合作委员会进行消毒,导致意外提前退出
- 为什么海湾合作委员会在实施is_nothrow_constructible时需要static_cast?
- 海湾合作委员会中 -faligned-new 的值
- 如何在进程之间共享大量数据而不重复?(国际刑罚委员会)
- 我们可以直接致电海湾合作委员会的simd_fast_mersenne_twister_engine(sfmt19937_64)吗?
- 如何(以及谁可以)实现C++委员会定义的标准库功能
- 海湾合作委员会在升压源中的警告
- 海湾合作委员会制作的不可拆卸的符号
- "this" Lambda 捕获的是不正确的。海湾合作委员会编译器错误?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 海湾合作委员会非法指导
- 海湾合作委员会"__builtin_popcount"如何运作?
- 为什么海湾合作委员会抱怨"declaration of 'foo' shadows a previous call [-Werror=shadow]"
- CodeBlocks成功地编译了,但海湾合作委员会失败了,为什么
- 海湾合作委员会和Clang在lambda的constexpr-ness上存在分歧?
- 海湾合作委员会中的通用 lambda