我正在为以下问题寻找惯用且快速的 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) 阅读何时应该使用预取?中接受的答案后 以及预取示例中的示例?,我在理解何时实际使用预取方面仍然存在很多问题。虽然这些答案提供了预取很有用的示例,但它们没有解释如何在实际程序中发现它。看起来像是随机猜测。
我特别对 intel x86 的 C 实现(prefetchnta、prefetcht2、prefetcht1、prefetcht0、prefetchw)感兴趣,这些实现可以通过 GCC 的__builtin_prefetch
内在函数访问。我想知道:
perf
。在这种情况下,什么指标(或它们之间的关系)表明有机会通过软件预取来提高性能?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
连续使用多个调用来一次预取多个缓存行?
这段代码
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, %eax
a == b
为什么以下代码的输出不是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