小编Cur*_*ous的帖子

从集合列表中选择元素以仅包含一个元素覆盖所有集合

我正在为以下问题寻找惯用且快速的 python 解决方案。输入是集合的列表。例如,3组字符串。

[
{a, b, c, d, e},
{a, c, e, f, g},
{e, f, a, d, l}
]
Run Code Online (Sandbox Code Playgroud)

我想找到字符串组合的所有选择,以便每组组合中只有一个元素。

例如,这些“映射”显示这些字符串出现在哪些列表位置:

a -> 0, 1, 2
b -> 0
c -> 0, 1
d -> 0, 2
e -> 0, 1, 2
f -> 1, 2
g -> 1
l -> 2
Run Code Online (Sandbox Code Playgroud)

所以正确的解决方案是下面的集合列表

a
b, g, l
b, f
e
c, l
d, g
Run Code Online (Sandbox Code Playgroud)

以下是一些错误解决方案的示例:

a, b # incorrect because more than one element (2) from set 0 are …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
146
查看次数

如何系统地使用软件预取?

阅读何时应该使用预取?中接受的答案后 以及预取示例中的示例,我在理解何时实际使用预取方面仍然存在很多问题。虽然这些答案提供了预取很有用的示例,但它们没有解释如何在实际程序中发现它。看起来像是随机猜测。

我特别对 intel x86 的 C 实现(prefetchnta、prefetcht2、prefetcht1、prefetcht0、prefetchw)感兴趣,这些实现可以通过 GCC 的__builtin_prefetch内在函数访问。我想知道:

  • 我如何才能看到软件预取对我的特定程序有帮助?我想我可以使用 Intel Vtune 或 Linux 实用程序收集 CPU 分析指标(例如缓存未命中次数)perf。在这种情况下,什么指标(或它们之间的关系)表明有机会通过软件预取来提高性能?
  • 如何找到缓存未命中最严重的负载?
  • 如何查看发生未命中的缓存级别来决定使用哪个预取(0,1,2)?
  • 假设我发现一个特定的负载在特定的缓存级别中遭受缺失,我应该在哪里放置预取?例如,假设下一个循环出现缓存未命中
for (int i = 0; i < n; i++) {
   // some code
   double x = a[i];
   // some code
}
Run Code Online (Sandbox Code Playgroud)

我应该在加载之前还是之后放置预取a[i]?它应该指向前方多远a[i+m]?我是否需要担心展开循环以确保我仅在缓存行边界上预取,或者它几乎是免费的,就像nop数据已经在缓存中一样?是否值得__builtin_prefetch连续使用多个调用来一次预取多个缓存行?

c performance x86 profiling prefetch

5
推荐指数
1
解决办法
1725
查看次数

为什么在 SETcc 之前进行 XOR?

这段代码

int foo(int a, int b)
{ 
    return (a == b);
}
Run Code Online (Sandbox Code Playgroud)

生成以下程序集(https://godbolt.org/z/fWsM1zo6q

foo(int, int):
        xorl    %eax, %eax
        cmpl    %esi, %edi
        sete    %al
        ret
Run Code Online (Sandbox Code Playgroud)

根据https://www.felixcloutier.com/x86/setcc

[SETcc] 根据状态标志的设置将目标操作数设置为 0 或 1

那么,如果根据无论如何结果为零/一,那么首先%eax用零初始化有什么意义呢?是不是gcc和clang出于某种原因都无法避免浪费CPU时钟?xorl %eax, %eaxa == b

c++ x86 assembly micro-optimization

3
推荐指数
1
解决办法
100
查看次数

C 中的宏比较结果不正确

为什么以下代码的输出不是10预期的20

#define A double

#if A == float
    #define X 10
#elif A == double
    #define X 20
#endif

int main() {
    return X;
}
Run Code Online (Sandbox Code Playgroud)

尝试一下: https: //godbolt.org/z/r8xhq5Pja

c

0
推荐指数
1
解决办法
95
查看次数

标签 统计

c ×2

x86 ×2

assembly ×1

c++ ×1

micro-optimization ×1

performance ×1

prefetch ×1

profiling ×1

python ×1