- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本上我有一个定义的结构
#define BATCH_SIZE 8
#define BATCH_SIZE_LOG 3
//#define BATCH_MASK 0x7070707070707070
// for the sake of understanding the ASM turn this into a no-op
#define BATCH_MASK (~(0UL))
struct batcher {
uint8_t indexes[8];
uint64_t vals[8 * BATCH_SIZE];
uint32_t __attribute__((noinline))
push(const uint64_t i, const uint64_t v) {
if(__builtin_expect(indexes[i] < (BATCH_SIZE - 1), 1)) {
vals[8 * i + indexes[i]++] = v;
return 0;
}
return 1;
}
uint32_t __attribute__((noinline))
claim(const uint64_t i) {
if(__builtin_expect(indexes[i] == (BATCH_SIZE - 1), 1)) {
indexes[i] = 8;
return 0;
}
return 1;
}
uint32_t
can_pop() const {
if(*((uint64_t *)(&indexes[0])) & BATCH_MASK) {
return 1;
}
return 0;
}
uint64_t __attribute__((noinline))
pop() {
if(__builtin_expect(can_pop(), 1)) {
const uint32_t idx = _tzcnt_u64(*((uint64_t *)(&indexes[0])) & BATCH_MASK) >> BATCH_SIZE;
return vals[8 * idx + --indexes[idx]];
}
return 0;
}
};
我很好奇的是,是否可以仅通过
pop
进行1次内存加载来实现
indexes
(所以总共需要2种内存,从
indexes
中实现1种内存,从
vals
中实现1种内存)
indexes
解释为
uint64_t
,以便我可以检查它是否为非0,如果是,则使用这些索引之一。
pop
与
batcher::pop():
movq (%rdi), %rax // first load from indexes
testq %rax, %rax
jne .L11
ret
.L11:
xorl %edx, %edx
movzbl (%rdi,%rdx), %eax // second load from indexes
decl %eax
movb %al, (%rdi,%rdx)
movzbl %al, %eax
movq 8(%rdi,%rax,8), %rax
ret
编译器实现此方法的方式是从
%(rdi)
到
%rax
,将其解释为
uint64_t
(测试是否存在非0索引),如果条件通过,则第二次加载将加载计算出的
uint8_t
索引。
pop
(我将要做什么)。我知道我可以通过对第一次加载的结果进行移位/屏蔽来完成相同的逻辑。我特别想知道的是,是否有一种方法可以索引第一次加载产生的
uint64_t
,就好像
uint8_t[8]
数组在哪里。
uint64_t
中的字节而编写的指令,或者某种方式可以重构
pop
的汇编实现以启用此功能。
最佳答案
大概是tzcnt
,将其四舍五入到8位的倍数,然后右移(使用BMI2 shrx
,因此它是单个uop)。然后,非零字节位于寄存器的底部,您可以在其中movzbl
将其零扩展到任何其他reg(not the same one, that would defeat mov-elimination)中。
tzcnt %rax, %rcx # input in RAX
and $-8, %ecx # 0xff...f8
shrx %rcx, %rax, %rdx # rdx = rax >> cl
movzbl %dl, %eax # zero latency between separate registers
(如果全零是可能的,则如果需要检测这种情况,则为
test / jz
,或者只是让移位发生。qword移位64会使值保持不变,因此结果将为
0
。)
_tzcnt_u64
之类的内在函数来做到这一点;对于此使用内联asm没有明显的好处。您可以使用GNU C进行未对齐的严格混叠安全qword加载
typedef uint64_t aliasing_u64 __attribute__((aligned(1), may_alias))
。
pcmpeqb
/
pmovmskb
/
tzcnt
的常规SIMD查找字节位置可能会过大。 (然后,整数
movzbl
使用字节偏移量从内存中加载该字节)。
关于c++ - 检查uint8_t [8]是否包含任何非0并以一个内存负载访问非零插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63540228/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!