- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用著名的麻省理工学院比特计数算法的一个版本,使用 SSE2 指令计算康威生命游戏中的邻居数。
这是 C 语言中的 MIT 位计数,扩展为计算位计数 > 63 位。
int bitCount(unsigned long long n)
{
unsigned long long uCount;
uCount = n – ((n >> 1) & 0×7777777777777777)
- ((n >> 2) & 0×3333333333333333)
- ((n >> 3) & 0×1111111111111111);
return ((uCount + (uCount >> 4))
& 0x0F0F0F0F0F0F0F0F) % 255;
}
这是 Pascal 的一个版本
function bitcount(n: uint64): cardinal;
var ucount: uint64;
begin
ucount:= n - ((n shr 1) and $7777777777777777)
- ((n shr 2) and $3333333333333333)
- ((n shr 3) and $1111111111111111);
Result:= ((ucount + (count shr 4))
and $0F0F0F0F0F0F0F0F) mod 255;
end;
我希望并行计算此结构中的位数。
32-bit word where the pixels are laid out as follows.
lo-byte lo-byte neighbor
0 4 8 C 048C 0 4 8 C
+---------------+
1|5 9 D 159D 1|5 9 D
| |
2|6 A E 26AE 2|6 A E
+---------------+
3 7 B F 37BF 3 7 B F
|-------------| << slice A
|---------------| << slice B
|---------------| << slice C
注意这个结构中间有 16 位需要查找。我想使用 SSE2 为中间的 16 位中的每一位计算邻居计数。为此,我将切片 A 放入 XMM0 low-dword,将切片 B 放入 XXM0-dword1 等。
我将 XMM0 复制到 XMM1,然后屏蔽掉 XMM0 低位字中位 5
的位 012-456-89A
,对 XMM0 的 word1 执行相同操作,等等。使用不同的切片和掩码,以确保 XMM0 和 XMM1 中的每个单词都包含不同像素的邻居。
问题
我如何调整 MIT 位数以在每个 XMM 字中得到每个字/像素的位数?
备注
我不想使用查找表,因为我已经有了这种方法而且我想测试 SSE2 是否会通过不需要对查找表进行内存访问来加快该过程。
使用 SSE 汇编的答案是最佳的,因为我在 Delphi 中对此进行编程,因此我使用的是 x86+SSE2 汇编代码。
最佳答案
MIT 算法很难在 SSE2 中实现,因为没有可用于最终 ... % 255
表达式的整数取模指令。在各种 popcnt 方法中,最容易和最有效地适用于 SSE 的方法可能是 "Hackers Delight" by Henry S. Warren 第 5 章中的第一个方法。 ,我在这里使用 SSE 内在函数在 C 中实现了它:
#include <stdio.h>
#include <emmintrin.h>
__m128i _mm_popcnt_epi16(__m128i v)
{
v = _mm_add_epi16(_mm_and_si128(v, _mm_set1_epi16(0x5555)), _mm_and_si128(_mm_srli_epi16(v, 1), _mm_set1_epi16(0x5555)));
v = _mm_add_epi16(_mm_and_si128(v, _mm_set1_epi16(0x3333)), _mm_and_si128(_mm_srli_epi16(v, 2), _mm_set1_epi16(0x3333)));
v = _mm_add_epi16(_mm_and_si128(v, _mm_set1_epi16(0x0f0f)), _mm_and_si128(_mm_srli_epi16(v, 4), _mm_set1_epi16(0x0f0f)));
v = _mm_add_epi16(_mm_and_si128(v, _mm_set1_epi16(0x00ff)), _mm_and_si128(_mm_srli_epi16(v, 8), _mm_set1_epi16(0x00ff)));
return v;
}
int main(void)
{
__m128i v0 = _mm_set_epi16(7, 6, 5, 4, 3, 2, 1, 0);
__m128i v1;
v1 = _mm_popcnt_epi16(v0);
printf("v0 = %vhd\n", v0);
printf("v1 = %vhd\n", v1);
return 0;
}
编译测试如下:
$ gcc -Wall -msse2 _mm_popcnt_epi16.c -o _mm_popcnt_epi16
$ ./_mm_popcnt_epi16
v0 = 0 1 2 3 4 5 6 7
v1 = 0 1 1 2 1 2 2 3
$
它看起来大约有 16 条算术/逻辑指令,因此它应该以每点大约 16/8 = 2 个时钟的速度运行。
如果需要,您可以轻松地将其转换为原始汇编程序 - 每个内部映射到单个指令。
关于optimization - 调整 MIT 的 bitcount 算法以并行计算单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431692/
我正在和我的 child 一起阅读一本“用 Scratch 学习编程”的书。其中一项练习是要求创建一个使用一些简单公式的“功能块”。他们没有在书中解释什么是“功能块”,否则我可能会错过。我也找不到任何
我正在尝试在 Linux 中安装 mit-scheme-9.2。我已成功下载 mit-scheme-9.2-x86-64.tar.gz http://ftp.gnu.org/gnu/mit-schem
我有这个代码: 但是每当 shoot 消息被发送到 bullet Sprite ,并且舞台上有一个克隆人还没有击中它的目标时,克隆人就会与 go to x: (xOfTower) y: (yOfTow
我正在从头开始创建一个迷你家庭游戏,我使用随机选择块在 1 到 27 之间进行选择。我有 27 个背景,上面写着 1 到 27 个数字。但是我注意到在大约 21-22 个数字之后,随机选择器无法选择任
我注意到永远(或重复())循环在迭代之间需要时间(没有“等待()秒”块)。这究竟是多久? 最佳答案 使用此代码进行测试: 每次迭代平均为 0.000000994 秒,因此在处理时间之外似乎没有故意延迟
我想从 makefile 评估一个脚本并退出,就像这样 mit-scheme --load "fact.scm" 但是,它对文件求值后,并没有退出,而是出现repl;如果我尝试 (exit)原语,它要
我的目标是构建 5x5 的图像网格。在以下代码中,row、col 和 rowcol 被创建为 Sprite 的本地变量,以及 newcol, newrow 和 cats 是全局的。 (顺便问一下,是否
我正在 Scratch 上制作一个桨球游戏(只是为了好玩),但我的计分遇到了问题。如果你想看我已经写的代码,游戏链接是https://scratch.mit.edu/projects/66541388
我正在使用 MIT app inventor 开发移动应用程序。我无法扩展列表的范围(超过 300 项)。 无法为其提供扩展应用程序的选项。 如果我将它更改为接近 298 个项目,它不会给我扩展它的机
我正在尝试使用 MIT 应用程序发明者开发一个应用程序,该应用程序在按下按钮时根据某些条件返回一个特定的整数。 基本上,我想创建一个程序,将用户分配到特定房间并将该特定组合分配给一个整数。 首先,应用
如何在 MIT 方案中引发和处理异常? 像[它不起作用] ((< val 0) (raise "-ve value") ) 最佳答案 最好找的地方是MIT/GNU Scheme documentati
谁能告诉我 mit-scheme 中的空值表示是什么?在 SICP 书中,它应该是“nil”,但它不起作用。 谢谢。 最佳答案 '()应该管用。基本上,scheme 中的 nil 是空列表,所以引用一
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我正在尝试使用 MIT-scheme 运行方案程序(在 GNU/Linux 下运行的 MIT/GNU 方案,版本 7.7.90.+ || 微码 15.1 || 运行时 15.7),我想访问命令-行参数
您是否知道任何符合 MIT/GNU 许可的好插件/脚本(可以是 jquery 或 html5 的 Canvas )可以让我构建和修改具有透明度的面积图? 内容如下: 虽然我不需要曲线,但它可以按 90
我正在使用 MIT 方案,并希望能够做这样的事情: (定义 π 3.14159265) 没有像这样的编码错误: ;Illegal character: #\U+80 ;To continue, cal
使用 Scheme 的入门编程类(class)通常使用一个版本,其中包括原始函数,如 first 和 bf(描述 here)。 感谢 this question,我在本地运行了 MIT Scheme
我目前正在尝试麻省理工学院开放式课件的“C 实用程序设计”中的练习。练习是关于霍夫曼编码的。这是 lab2 第 2 部分,我遇到了问题。主要是 pq_insert() 方法。我对如何执行节点插入感到很
我刚开始玩 Scratch... 我似乎有一只猫的 Sprite 和两件“服装”,我猜它们就像相框。 我做了这个序列: ...但是当我点击绿旗时,猫会向右移动,但服装不会切换。 如果我做一个更简单的序
如何平滑 Scratch 中的动画?主要是,我希望当您按住右箭头时,它会向右移动而没有任何明显的抖动。另外,当您握住箭头时,scratch 会让您等待一秒钟才能重复。我怎样才能把这些东西弄平? 最佳答
我是一名优秀的程序员,十分优秀!