- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
据我所知,“现代”CPU 有相当令人印象深刻的例程来处理二进制数据,例如通过相同的操作流式传输许多数据。
临时我找不到一个库来使用那些 CPU 或 GPU 硬件制作简单的指令(在 GB 内存中设置每 5 位),只是经典的 | << &
技巧。
但是设置每第 5 位或第 721 位必须与在宽度为 5 或宽度 721 的黑白图片中绘制垂直黑线相同,我希望有一种快速的方法。
所以我的问题是:是否有任何提示如何在主流 x86_64 Intel/AMD CPU 或 GPU 上以快速有效的方式玩位?开源将是一个附加条件。
最佳答案
首先,对大块内存执行此操作会因缓存未命中而成为瓶颈。当前的 CPU 每次加载/存储可以执行相当多的指令,并且仍然会最大化内存带宽。如果我们谈论的是已经在 L1 缓存中的几 k 内存,这个问题就更有趣了。
如果您每隔 721 位设置一次, vector 的东西就帮不了您了。您的步幅为 90.125 字节,甚至比 AVX512 vector 还大。所以最佳解决方案是在适当的地址做单字节OR
。编写循环以跟踪字节内的位位置和字节位置非常重要。如果它是一个编译时常量步幅,按 8 展开会很容易。 (每第 8 个 OR
额外增加一个字节。)
; pointer in rdi
; loop counter in ecx
.loop:
or byte ptr [rdi+90*0], 1<<0
or byte ptr [rdi+90*1], 1<<1
or byte ptr [rdi+90*2], 1<<2
or byte ptr [rdi+90*3], 1<<3
or byte ptr [rdi+90*4], 1<<4
or byte ptr [rdi+90*5], 1<<5
or byte ptr [rdi+90*6], 1<<6
or byte ptr [rdi+90*7], 1<<7
add rdi, 90*8 + 1
sub ecx, 8
jg .loop
; handle the last up to 7 iterations
对于不是编译时常量的步长,您可以在执行 ptr += stride/8 + carry
时将 8 位寄存器循环 stride % 8
>。实际上,通过寄存器计数循环比通常的 ALU 操作(在最近的 Intel 上)慢一点,但可变计数移位也是如此。
; ecx = unsigned int stride. rdi=char *dest
mov ebx, ecx
and ecx, 7 ; ecx = stride%8
shr ebx, 3 ; ebx = stride/8
mov al, 1
.loop:
or byte ptr [rdi], al
rol al, cl
add rdi, rbx
; efficiently figure out when we need to add an extra 1 to rdi
; lost interest at this point, feel free to edit or post another answer finishing this code.
dec edx
jg .loop
我正在想办法增加字节内位的位置,它在回绕时设置进位标志,这样你就可以 adc
来做 ptr+= stride +携带
。或者只是得到一个 0 或 1 来添加。
如果您的位步幅等于 128b,那么事情就微不足道了。只需读取/修改并使用常量掩码存储到 POR
。
如果您的步幅较小,那么事情就会变得有趣。 vector 寄存器没有按位循环指令。在 xmm 寄存器中移动多个设置位可能有一些聪明的方法。
关于c - 内存操作 : set every n-th bit (C/C++) in modern CPUs/GPUs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888096/
我想使用 Extjs 6.5.2 尝试 hello world 示例。当我尝试运行以下代码时 var containerPanel = Ext.create('Ext.panel.Panel'
在听说了Perl生态系统的新组成部分(例如Moose,DeclareX和Catalyst)之后,我认为对Perl感到高兴。不幸的是,我可以找到所有针对Perl 5.8或5.6的入门资料,而对这些较新的
HList package是基于现在古老的 Haskell 技术。一个简单的问题是:考虑到过去 8 年 Haskell/GHC 开发的所有精彩新特性,“现代”HList 的构建方式会非常不同吗?我意识
真正的现代正则表达式实际上可以识别什么类型的语言? 只要存在带有反向引用的无限长度捕获组(例如 (.*)_\1),正则表达式现在就会匹配非常规语言。但这本身不足以匹配 S::= '(' S ')' |
我必须使用 modernizer 来检测浏览器是否支持“cssscrollbar”属性,true 或 false。基于这个值,我必须做一些事情,比如添加插件和 CSS。 我正在使用下面这样的东西,我不
如何在 Relay Modern 中取消订阅? 我已经按照 How to GraphQL React + Relay 上的订阅教程进行操作但它没有提及您如何取消订阅,也没有提及 Relay Moder
我听说过很多关于这个“现代 Perl”的事情。它是什么? 我听到的一件事是新的开放语法: open my $FH, '<', $filename 并不是 open FH, "<$filename";
{这是现代接力赛} 在我的 UserQuery.js 中, class UserQuery extends Component { render () { return (
类(class)TypeCast可以追溯到 2004 年,因此 Haskell 相当“古老”(尽管仍然相当出色)。我的问题是:如果今天在最先进的 GHC 中重新实现 [最好是 7.6,但是继续,使用
我的 React 项目中有以下设置: export default class OverviewScreen extends React.Component { public render() {
在问这个可能含糊不清的问题之前,我搜索了 SO,发现许多对“现代浏览器”的引用,但没有定义。由于这是一个被广泛使用和引用的术语,令我惊讶的是我在 Internet 上找不到定义甚至描述。 那么,在 2
我正在使用字典来使用登录页面中的用户详细信息来填充列表内容。 但是我需要为每个列表项创建一个单独的源页面。 在页面加载静态源页面的那一刻,我是否可以动态设置它,即每个创建的列表链接的源页面? 或者,如
我正在 Visual Studio 上(在 C# WPF 应用程序模式下)重新制作一个在 AutoPlay media Studio 上制作的应用程序。 当我需要从计算机中获取文件时,我在 Stack
我有与此类似的 C++ 类: class A{ std::string str; public: A(std::string &str) : str(str){} int cm
现代浏览器(即 Firefox 3+、Safari 4+、IE 7+)中正则表达式的最大大小是多少?假设一个简单的正则表达式,例如“foo|bar|baz|woot|...” 最佳答案 您可以使用此代
我已经安装了 R 包 extrafont和 fontcm .然后尝试在 Sweave 中使用 Computer Modern 字体绘制数据: >= plot(na, family="CM Roman"
有什么方法可以找出现代用户界面的当前主题颜色集吗? WinAPI 函数或注册表值对我来说可能是最好的解决方案。 我的意思是当前主题颜色 this . 最佳答案 在UxTheme.dll 中有一个名为G
我正在使用带有现代中继的 react native 应用程序。 目前我们的应用程序的 fetchQuery 实现,只是在网络上做一个 fetch (就像在 https://facebook.githu
我正在使用基于 token 的身份验证,并且想知道如何在 Relay Modern 中将其完全结合在一起。我已经完成一半了。任何帮助深表感谢。这是我的设置: 位于内部顶层我渲染入口点。 内部我有一个在
是否可以使valijson与Nlohmann的json解析器一起使用,以从文件中引用其他文件中的子模式来读取架构? json mySchemaDoc; if (!valijson::utils::lo
我是一名优秀的程序员,十分优秀!