gpt4 book ai didi

c - C程序的可变运行时间

转载 作者:太空狗 更新时间:2023-10-29 15:04:57 26 4
gpt4 key购买 nike

我的 (simd) 实现需要不同的时间,尽管它是针对固定输入运行的。运行时间在 1 亿个时钟周期到 1.2 亿个时钟周期之间变化。该程序调用一个函数大约 600 次,而该函数中最昂贵的部分是内存被访问约 2000 次。因此,在我的程序中,整体内存占用量相当高。

内存访问模式/初始内存内容是否会导致运行时间的变化?

我使用 valgrind 来分析我的程序。它显示每次内存访问大约需要 8 条指令。这正常吗?

以下是被调用600次的一段代码(函数)。 Mulprev[32][20]是访问次数最多的数组。

j = 15;  
u3v = _mm_set_epi64x (0xF, 0xF);
while (j + 1)
{

l = j << 2;
for (i = 0; i < 20; i++)
{
val1v = _mm_load_si128 ((__m128i *) &elm1v[i]);
uv = _mm_and_si128 (_mm_srli_epi64 (val1v, l), u3v);
u1 = _mm_extract_epi16 (uv, 0);
u2 = _mm_extract_epi16 (uv, 4) + 16;

for (ival = i, ival1 = i + 1, k = 0; k < 20; k += 2, ival += 2, ival1 += 2)
{
temp11v = _mm_load_si128 ((__m128i *) &mulprev[u1][k]);
temp12v = _mm_load_si128 ((__m128i *) &mulprev[u2][k]);

val1v = _mm_load_si128 ((__m128i *) &res[ival]);
val2v = _mm_load_si128 ((__m128i *) &res[ival1]);

bv = _mm_xor_si128 (val1v, _mm_unpacklo_epi64 (temp11v, temp12v));
av = _mm_xor_si128 (val2v, _mm_unpackhi_epi64 (temp11v, temp12v));

_mm_store_si128 ((__m128i *) &res[ival], bv);
_mm_store_si128 ((__m128i *) &res[ival1], av);
}
}

if (j == 0)
break;
val0v = _mm_setzero_si128 ();

for (i = 0; i < 40; i++)
{
testv = _mm_load_si128 ((__m128i *) &res[i]);
val1v = _mm_srli_epi64 (testv, 60);
val2v = _mm_xor_si128 (val0v, _mm_slli_epi64 (testv, 4));
_mm_store_si128 (&res[i], val2v);
val0v = val1v;
}
j--;
}

我想减少程序的计算时间。有什么建议吗?

最佳答案

您在加载和存储之间几乎不执行任何计算,因此您的执行时间很可能由进出缓存/内存的 I/O 成本决定。更糟糕的是,您的数据集似乎相对较小。可能进一步优化它的唯一方法是改进内存访问模式(尽可能按顺序访问,并确保不浪费缓存行等)和/或将这些操作与在同一数据集上运行的其他代码组合在这个例程之前/之后(这样加载/存储的成本就会有所摊销)。

编辑:请注意,当您针对此例程的明显较早版本提出几乎相同的问题时,我给出了非常相似的答案:How to make the following code faster - 你似乎没有注意到你的主要性能问题是内存访问,而不是计算。

关于c - C程序的可变运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843270/

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