Переменная время выполнения программы C

My (simd) занимает разное количество времени, хотя и выполняется для фиксированного ввода. Время работы варьируется от 100 миллионов до 120 миллионов тактовых циклов. Программа вызывает функцию около 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--;
}       

Я хочу уменьшить время вычисления моей программы. Есть предложения?

5
задан Paul R 30 January 2011 в 23:31
поделиться