- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
是否有一个内在函数将在输入数组的所有位置设置一个值,其中相应的位置在提供的位掩码中有一个1位?
10101010是位掩码
值为121
它将用值121设置位置0、2、4、6
最佳答案
使用AVX512,是的。蒙面商店是AVX512中的一流操作。
使用_mm512_mask_storeu_epi8 (void* mem_addr, __mmask64 k, __m512i a)
vmovdqu8
将位掩码用作数组向量存储的AVX512掩码。(平均512BW。对于AVX512F,只能使用32或64位元素大小。)
#include <immintrin.h>
#include <stdint.h>
void set_value_in_selected_elements(char *array, uint64_t bitmask, uint8_t value) {
__m512i broadcastv = _mm512_set1_epi8(value);
// integer types are implicitly convertible to/from __mmask types
// the compiler emits the KMOV instruction for you.
_mm512_mask_storeu_epi8 (array, bitmask, broadcastv);
}
-O3 -march=skylake-avx512
)编译为:
vpbroadcastb zmm0, edx
kmovq k1, rsi
vmovdqu8 ZMMWORD PTR [rdi]{k1}, zmm0
vzeroupper
ret
__m512i _mm512_movm_epi8(__mmask64 )
创建0/-1向量。其他元件尺寸可供选择。但是,当数组大小不是向量宽度的倍数时,使用屏蔽存储可以安全地使用它,因为未经修改的元素不会被读取/重写或任何东西;它们确实是未经修改的。(不过,如果任何未触及的元素在实际存储上出现故障,CPU可能需要缓慢的微码辅助。)
pdep
,您可以使用它将位图扩展为字节映射。有关使用
_pdep_u64(mask, 0x0101010101010101);
将
mask
中的每个位解压为一个字节的示例,请参见
my AVX2 left-packing answer。这将在
uint64_t
中为您提供8个字节。在C语言中,如果在它和数组之间使用
union
,那么它会给你一个0/1元素的数组。但是,当然,如果数组没有在第一个地方溢出,则要求编译器发出移位指令。您可能只想将
memcpy
放入一个永久数组中。)
uint64_t
的逆,并使用它来混合。(请参见下面的“无
pmovmskb
部分)
pdep
。或者如果它是一个由4位字节组成的数组,那么您可以做一个16位掩码,而不是8位掩码。
pdep
将位扩展到字节,但随后使用
pdep
将字节扩展到dword或向量中的任何内容。例如
// only the low 8 bits of the input matter
__m256i bits_to_dwords(unsigned bitmap) {
uint64_t mask_bytes = _pdep_u64(bitmap, 0x0101010101010101); // expand bits to bytes
__m128i byte_vec = _mm_cvtsi64x_si128(mask_bytes);
return _mm256_cvtepu8_epi32(byte_vec);
}
[v]pmovzx
复制到char数组中,您可以(而且应该)只使用
uint64_t
(以避免由于指针别名或未对齐而导致的任何未定义行为)。这将用现代编译器编译成一个8字节的存储区。
memcpy
的字节上写一个循环,要么将char数组强制转换为
uint64_t*
。这通常工作得很好,因为
uint64_t
可以对任何内容进行别名,所以以后读取char数组时不会有任何严格的别名UB。但是,如果编译器假设在自动矢量化时它是对齐的,则即使在x86上,未对齐的
uint64_t*
也可能导致问题。
Why does unaligned access to mmap'ed memory sometimes segfault on AMD64?
char*
将0/1字节的掩码转换为0/-1掩码,然后使用
uint64_t*
将值广播到所有字节位置。
0xFF
,那么即使数组中有字节元素,也应该使用SSE2/SSE4或AVX2。加载旧内容,
uint64_t
和
value=121
,使用字节掩码作为控制向量。
vpblendvb
只使用每个字节的高位,因此您的
set1(121)
常量可以
vpblendvb
将输入位分散到每个字节的高位,而不是低位。(所以不需要乘以
pdep
就可以得到AND掩码)。
0x8080808080808080
。(将掩码从字节扩展到DWORD时,使用
0xFF
而不是zx复制符号位)。这可能是一个性能战胜变量混合+总是读/写。
Is it possible to use SIMD instruction for replace?。
_mm256_maskstore_epi32
pmovsx
在Ryzen上的速度非常慢,甚至在Intel上,这也不是最好的选择。
pdep
来查找已设置位的元素。
pdep
,例如使用
pcmpeqb/w/d
或256bit AVX2版本。您可以处理16位块中的位图,只需使用
value
就可以生成16字节向量,将其中的字节发送到正确的元素。
关于c - 固有地基于BitMask设置数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538254/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!