繁体   English   中英

C程序的可变运行时间

[英]Variable running time of a C program

我的(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成本决定。 更糟糕的是,您的数据集似乎相对较小。 可能进一步优化这一点的唯一方法是改进内存访问模式(尽可能使访问顺序,并确保不浪费缓存行等)和/或将这些操作与在同一数据集上运行的其他代码组合在一起在此例行程序之前/之后(以便加载/存储的成本在某种程度上摊销)。

编辑:请注意,当你为这个例程的明显早期版本提出相同的问题时,我给出了一个非常相似的答案: 如何更快地使下面的代码 - 你似乎已经错过了这里你的主要性能问题是内存访问,而不是计算。

电脑很复杂。 可能很容易成为后台进程以某种方式干扰。 如果没有其他信息,很难提出改进建议。 通常,最佳优化是高级优化。 选择更好的算法,减少昂贵的操作。 如果您认为那里没有太大的改进空间,那么不要期望获得太高的收益。 你说你的内存访问需要很多周期。 我可以建议您尽可能使用受限制的指针,但很难就优化问题提供一般性建议。 你有点必须亲自试试。

内存访问的8个周期相当长。 另一个进程可能会对CPU缓存产生负面影响,导致程序出现大量缓存未命中,或者如果您的内存是动态分配的,则可能会看到未对齐的内存访问损失。

它可能是任何东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM