gpt4 book ai didi

c - 如何使以下代码更快

转载 作者:行者123 更新时间:2023-12-03 16:56:11 25 4
gpt4 key购买 nike

int u1, u2;  
unsigned long elm1[20], _mulpre[16][20], res1[40], res2[40]; 64 bits long
res1, res2 initialized to zero.

l = 60;
while (l)
{
for (i = 0; i < 20; i += 2)
{
u1 = (elm1[i] >> l) & 15;
u2 = (elm1[i + 1] >> l) & 15;

for (k = 0; k < 20; k += 2)
{
simda = _mm_load_si128 ((__m128i *) &_mulpre[u1][k]);
simdb = _mm_load_si128 ((__m128i *) &res1[i + k]);
simdb = _mm_xor_si128 (simda, simdb);
_mm_store_si128 ((__m128i *)&res1[i + k], simdb);

simda = _mm_load_si128 ((__m128i *)&_mulpre[u2][k]);
simdb = _mm_load_si128 ((__m128i *)&res2[i + k]);
simdb = _mm_xor_si128 (simda, simdb);
_mm_store_si128 ((__m128i *)&res2[i + k], simdb);
}
}
l -= 4;
All res1, res2 values are left shifted by 4 bits.
}

上面提到的代码在我的程序中被调用了很多次(profiler 显示 98%)。

编辑:在内部循环中,res1[i + k] 值被多次加载相同的 (i + k) 值。我在 while 循环中尝试了这个,我将所有 res1 值加载到 simd 寄存器(数组)中,并在最内层的 for 循环中使用数组元素来更新数组元素。完成两个 for 循环后,我将数组值存储回 res1、re2。但是计算时间随之增加。知道我哪里错了吗?这个想法似乎是正确的

欢迎提出任何让它更快的建议。

最佳答案

不幸的是,编译器可能已经完成了最明显的优化:

  • 您可以拉取 &_mulpre[u1]&mulpre[u2] 我们的内部循环。
  • 您可以拉动 &res1[i] 我们的内部循环。
  • 对两个内部操作使用不同的变量,并对它们重新排序,可能会实现更好的流水线操作。

可能交换外部循环会改善 elm1 上的缓存位置。

关于c - 如何使以下代码更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4450102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com