- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 AVX2 内部函数与 C++ 一起使用。我正在使用 float (__m256)
。现在一个寄存器可以容纳 8 个 float 。但是,如果我的 float 少于 8 个(假设我有 5 个),会发生什么情况。在这种情况下,较低的 3 个 float 具有垃圾值。
float a[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float b[5] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
__m256 _a = _mm256_loadu_ps(a);
__m256 _b = _mm256_loadu_ps(b);
__m256 _c = _mm256_div_ps(_a, _b);
for(int i=0; i<8; ++i)
cout << _c[i] << endl;
我在下面的屏幕截图中得到的结果:
有什么办法可以将结果中的最后3个数字变为0吗?我不想运行循环,因为这会违背使用 AVX 的目的。此外, float 的数量(本例中为 5)是可变的。
我是 AVX 新手,非常需要一些帮助。
在更大的问题中,我从数据流中读取数组,因此事先不知道数组的大小,以便能够在数组末尾附加 0 而无需运行循环。
最佳答案
float a[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float b[5] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
__m256 _a = _mm256_loadu_ps(a);
__m256 _b = _mm256_loadu_ps(b);
这是未定义的行为,因为您正在读取数组之外的内容。
您可以使用_mm256_setzero_ps()
清除_a
和_b
中的所有元素:
__m256 _a = _mm256_setzero_ps;
__m256 _b = _mm256_setzero_ps;
将 5 个元素加载到 __m256
寄存器中有点棘手。如果可能的话,可以用 8 个元素来声明。我相信 C++ 将使用 0.0f 进行值初始化。
float a[8] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float b[8] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
如果您无法声明包含 8 个元素的数组,那么我可能会使用 GCC 和 Clang 尝试类似的操作:
__m256 _a = _mm256_setzero_ps(), _b = _mm256_setzero_ps();
memcpy(&_a, a, 5*sizeof(float));
memcpy(&_b, b, 5*sizeof(float));
<小时/>
您还可以复制到中间数组并允许编译器优化:
float a[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float b[5] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
float t[0] = {0.0f};
memcpy(t, a, 5*sizeof(float));
__m256 _a = _mm256_loadu_ps(t);
memcpy(t, b, 5*sizeof(float));
__m256 _b = _mm256_loadu_ps(t);
(编者注:这可能会编译为与 memcpy 大致相同的 asm 到 __m256
对象中。使用当前的编译器,它实际上会复制到堆栈并导致存储转发停止已重新加载。)
最后一种可能性是加载一个完整的 __m128
,在第二个 __m128
中设置一个元素,然后将两个 __m128
组合成一个__m256
。我对此没有太多经验,但这可能会满足您的要求。我没有测试过:
float a[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
float b[5] = {2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
__m256 _a = _mm256_set_m128 (_mm_loadu_ps(a+0), _mm_load_ps1(a+4));
__m256 _b = _mm256_set_m128 (_mm_loadu_ps(b+0), _mm_load_ps1(b+4));
_mm_load_ps1
会将第一个元素(a[4]
或 b[4]
)广播到其余元素中。其余元素将不为 0,但它们也不会是随机垃圾。当您进行计算时,您将它们视为“不关心”。
如果您确实需要最后三个元素为 0.0f,那么这应该可以。但我相信这会花费您两条额外的指令,而不是 _mm_load_ps1
。
// x set to {5.0f, 0.0f, 0.0f, 0.0f}
__m128 x = _mm_insert_ps(_mm_setzero_ps(), _mm_load_ps1(a+4), 0);
a
的完整语句如下所示:
__m256 _a = _mm256_set_m128 (_mm_loadu_ps(a+0),
_mm_insert_ps(_mm_setzero_ps(), _mm_load_ps1(a+4), 0));
在退出处理 __m256
数据类型的例程之前,您可能需要调用 _mm256_zeroupper
。查看类似 Using AVX CPU instructions: Poor performance without “/arch:AVX” 的问题和 Using xmm parameter in AVX intrinsics .
无论您做出什么决定,您都应该对应用程序的性能进行基准测试,以确定哪个最适合您的程序。
另请参阅Intel Intrinsics Guide .
关于C++ AVX2 内在函数非标准大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902478/
我正在编写一个程序,它必须规范化音频 *.wav 文件。有一个“显示头部数据”的任务:ChunkId、ChunkSize 等等。 我想创建一个名为display_hdr 的函数(为了减少main.c
我有一个带有缩放类的 css 文件:1。 我在浏览器控制台上收到以下错误。 此页面使用非标准的“缩放”属性。相反,您可以将 calc() 或“transform”与“transform-origin:
我想模拟来自非标准密度函数的数据。我已经找到以下链接( How do I best simulate an arbitrary univariate random variate using its
使用已安装的 JDK 版本时,默认系统语言环境报告正确,但当我使用 adoptopenjdk-11 时tar.gz ,总是报告为en_US import java.util.Locale; publi
我如何强制 automake 为非标准 C++ 后缀文件生成依赖项跟踪?特别是我的意思是生成 .deps 目录文件内容。我也在使用 libtool。 谢谢 最佳答案 看看this section in
我有一个快速解决方法的问题,以享受非标准 gnu 的好处 case ranges .例如,非标准: case 1 ... 5: 可以替换为: case 1: case 2: case 3: case
我有两个“日期”字段需要加入。 第一个是格式为 yyyy-mm-dd hh:mm:ss 的普通日期时间 第二个是红头步骤子格式的 varchar(8) mmddyyyy 现在这变得很痛苦,因为没有简单
我有一个符合以下约定的 CSV val1,val2,outerStruct1{valA,valB,innerStruct2{valX, valY},valC},... 问题是当我尝试正则表达式oute
我有数据列: id name type number 1 n1 t1 num1 2 n2 t1 num2 3 n3 t1 num3 4
我正在为 Shelly 系列设备开发 openHAB2 绑定(bind)。 http接口(interface)运行良好,但无法注册获取COAP事件。 有人有使用 Californium 框架的经验吗?
我在 UILabel 上显示商标“TM”字符时遇到了一些问题。 出现问题的“TM”字符是\U0099 而不是通常的\U2122 稍微深挖一下,发现“TM”字\U0099属于极少数的汉字。 所以我猜 i
请原谅我的无知,我是 c++ 的新手。 完整错误信息: coog.cpp(74): error C3867: 'Manager::start_foo': 非标准语法;使用“&”创建指向成员的指针 我正
我有一个可以生成如下 JSON 的 API: )]}', { //JSON DATA } //JSON DATA 是有效的 JSON,但顶部的 )]}', 不是。 当我尝试通过逻辑应用获取此数
我尝试使用 Apache Ant Get task获取我们公司另一个团队生成的 WSDL 列表。他们将它们托管在 http://....com:7925/services/ 上的 weblogic 9
我在 Google App Engine 上有一个 servlet,它从页面获取文本,将其存储为实体,然后将其发送回客户端。当我存储“You're”一词时,它会像平常一样在 GAE 本地存储中显示为“
这个问题在这里已经有了答案: Is there a way to access the underlying container of STL container adaptors? (10 个答案
我在编译这段代码时遇到了问题: void MyClass::MyMethod(Type * new_ptr) { myInternalUniquePtr_->swap(std::unique_
我有两个 Eigen::VectorXd 对象,A 和 B,具有相同的维度 n。 我想创建一个新的 vector C,这样: 如果 B[i] 是 NaN,则 C[i] = A[i] 否则:C[i] =
在 C++ 中,以这种格式向日期添加一天的最简单方法是什么: “20090629-05:57:43” 可能使用 Boost 1.36 - Boost::date、Boost::posix_date 或
我正在使用 Apache HTTPComponents 4.3 的 HttpCore 库编写一个 HTTP 服务器( java )。我的服务器必须能够接收具有非标准 HTTP 方法(GET、POST、
我是一名优秀的程序员,十分优秀!