- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将每个字节(8 位有符号整数)的两个 m128i
字节相乘。
这里的问题是溢出。我的解决方案是将这些 8 位有符号整数存储为 16 位有符号整数,相乘,然后将整个东西打包成 16 x 8 位整数的 m128i
。
这是我制作的 __m128i mulhi_epi8(__m128i a, __m128i b)
仿真:
inline __m128i mulhi_epi8(__m128i a, __m128i b)
{
auto a_decomposed = decompose_epi8(a);
auto b_decomposed = decompose_epi8(b);
__m128i r1 = _mm_mullo_epi16(a_decomposed.first, b_decomposed.first);
__m128i r2 = _mm_mullo_epi16(a_decomposed.second, b_decomposed.second);
return _mm_packs_epi16(_mm_srai_epi16(r1, 8), _mm_srai_epi16(r2, 8));
}
decompose_epi8
以非simd方式实现:
inline std::pair<__m128i, __m128i> decompose_epi8(__m128i input)
{
std::pair<__m128i, __m128i> result;
// result.first => should contain 8 shorts in [-128, 127] (8 first bytes of the input)
// result.second => should contain 8 shorts in [-128, 127] (8 last bytes of the input)
for (int i = 0; i < 8; ++i)
{
result.first.m128i_i16[i] = input.m128i_i8[i];
result.second.m128i_i16[i] = input.m128i_i8[i + 8];
}
return result;
}
这段代码运行良好。我现在的目标是实现这个 for 循环的 simd 版本。我看着 Intel Intrinsics Guide但我找不到办法做到这一点。我猜 shuffle 可以解决问题,但我无法将其概念化。
最佳答案
由于要进行有符号乘法,需要将每个字节符号扩展为16bit字,或者将它们移动到每个16bit字的上半部分。由于之后将结果打包在一起,因此可以将输入拆分为奇数字节和偶数字节,而不是高半部分和低半部分。
然后奇数字节的符号扩展可以通过将所有 16 位部分向右算术移动来完成
您可以通过屏蔽掉偶数字节来提取奇数字节,要获得偶数字节,您可以移位左边的所有 16 位部分(都需要乘以 _mm_mulhi_epi16
)。
以下应该适用于 SSE2:
__m128i mulhi_epi8(__m128i a, __m128i b)
{
__m128i mask = _mm_set1_epi16(0xff00);
// mask higher bytes:
__m128i a_hi = _mm_and_si128(a, mask);
__m128i b_hi = _mm_and_si128(b, mask);
__m128i r_hi = _mm_mulhi_epi16(a_hi, b_hi);
// mask out garbage in lower half:
r_hi = _mm_and_si128(r_hi, mask);
// shift lower bytes to upper half
__m128i a_lo = _mm_slli_epi16(a,8);
__m128i b_lo = _mm_slli_epi16(b,8);
__m128i r_lo = _mm_mulhi_epi16(a_lo, b_lo);
// shift result to the lower half:
r_lo = _mm_srli_epi16(r_lo,8);
// join result and return:
return _mm_or_si128(r_hi, r_lo);
}
注意:以前的版本使用移位来对奇数字节进行符号扩展。在大多数 Intel CPU 上,这会增加 P0 的使用(也需要用于乘法)。位逻辑可以在更多的端口上运行,所以这个版本应该有更好的吞吐量。
关于c++ - SSE2 打包的 8 位整数有符号乘法(高半) : Decomposing a m128i (16x8 bit) into two m128i (8x16 each) and repack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292018/
我正在尝试使用 BeautifulSoup 来解析 html 文档。我试图编写一个代码来解析文档,找到所有表格并删除那些具有数字/字母数字比例 > 15%。我使用了给出的代码作为上一个问题的答案: D
我想删除强标签内的文本,所以我这样做了: for strong in soup.find('strong'): strong.decompose() 但是当我打开文件时,最后一个文件并没有被删
我正在尝试创建一个仅使用给定数字分解数字的函数: 比如要分解的数是5,分解的方式有1,2,5 def func(Number_to_decompose,list_with posible_ways_t
我以类似于以下的方式使用 glm::decompose ( https://glm.g-truc.net/0.9.6/api/a00204.html): glm::mat4 matrix; // ..
我想要做的是能够将变换矩阵推送和弹出到 SpriteBatch 中。我有 2 个 Sprite ,父级和子级,子级应该相对于父级进行缩放、旋转、平移。 我目前有一个使用纹理四边形的实现,但我认为使用内
我正在尝试从此页面获取所有标题的类别。 from bs4 import BeautifulSoup import urllib2 headers = { 'User-Agent': '
我在使用 python 和 BeautifulSoup 制作的爬虫中无法让 decompose() 函数正常工作。 问题如下。我正在尝试从网站产品中获取所有规范数据(您可以在源代码中看到): soup
我正在制作我的蒙皮引擎并使其适用于 1 个矩阵/框架/骨骼。然而,这是大量的数据,所以我想更进一步,做 1 个矩阵/关键帧/骨骼,这样我就可以插入骨骼的旋转和平移(每个轴上的缩放比例始终为 1,所以我
本文整理了Java中boofcv.alg.geo.calibration.Zhang99DecomposeHomography.decompose()方法的一些代码示例,展示了Zhang99Decom
我在使用 BeautifulSoup4 时发现了一个奇怪的行为。我有以下 XML(文件名:fake_product.xml):
使用 python-igraph 0.7.1 (Python 3.4.8),我想将有向图分解为所有未连接的子图。但是,g.decompose(mode=WEAK) 失败: igraph._igraph
问题 问题很简单:我有包含这个值的 XML 穆勒 这似乎是用变音符号表示 u 的有效 XML 格式,就像这样。 穆勒 但是到目前为止,我们尝试过的所有解析器都会生成 u¨ —— 两个不同的字符。 背景
使用如下所示的 PartiQL 查询时: 从 my_table WHERE my_field IN [1, 2, 3...] 中选择 * 我收到了此错误,我在 Google 中找不到该错误,并且没有告
我需要从 HTML 中取出电话号码和电子邮件。 我可以得到数据。 description_source = soup.select('a[href^="mailto:"]'),
从速度和效率的角度来看:哪个被认为是最佳实践,是创建一个临时对象还是分解一个(可能是临时的)参数对象? 在这个例子中,为了 DRY 目的,函数的实现是互斥的。两者都不会如图所示实现,但将根据另一个实现
我正在尝试将每个字节(8 位有符号整数)的两个 m128i 字节相乘。 这里的问题是溢出。我的解决方案是将这些 8 位有符号整数存储为 16 位有符号整数,相乘,然后将整个东西打包成 16 x 8 位
我是一名优秀的程序员,十分优秀!