Ускорить математический код в C #, написав C DLL? - PullRequest
12 голосов
/ 25 мая 2010

У меня очень большой вложенный цикл for, в котором выполняются некоторые умножения и сложения для чисел с плавающей запятой.

for (int i = 0; i < length1; i++)
{
    double aa = 0;
    for(int h = 0; h < 10; h++)
    {
       aa += omega[i][outsideGeneratedAddress[h]];
    }

    double alphaOld = alpha;
    alpha = Math.Sqrt(alpha * alpha + aa * aa);

    s = -aa / alpha;
    c = alphaOld / alpha;

    for(int j = 0; j <= i; j++)
    {
        double oldU = u[j];
        u[j] = c * oldU + s * omega[i][j];
        omega[i][j] = c * omega[i][j] - s * oldU;
    }
}

Этот цикл занимает большую часть моего времени обработки и является узким местом.

Могу ли я увидеть какие-либо улучшения скорости, если переписать этот цикл в C и подключиться к нему из C #?

РЕДАКТИРОВАТЬ: Я обновил код, чтобы показать, как генерируются s и c. Кроме того, внутренний цикл на самом деле идет от 0 до i, хотя это, вероятно, не имеет большого значения для вопроса

EDIT2: Я реализовал алгоритм в VC ++ и связал его с C # через dll и увидел увеличение скорости на 28% по сравнению с C #, когда все оптимизации включены. Аргумент для включения SSE2 работает особенно хорошо. Компиляция с MinGW и gcc4.4 только дала прирост скорости на 15%. Только что попробовал компилятор Intel и увидел увеличение скорости этого кода на 49%.

Ответы [ 12 ]

0 голосов
/ 25 мая 2010

Также учитывайте стоимость сортировки данных между управляемыми и собственными вызовами. C # имеет довольно быструю скорость выполнения. Вы также можете использовать NGEN для создания собственных образов сборки для более быстрого выполнения.

0 голосов
/ 25 мая 2010

Сильно сомневаюсь в этом. Внутренний цикл, который обрабатывает примитивные типы и не выделяет память, будет чертовски эффективным в C #. Собственный байт-код будет сгенерирован один раз из IL, поэтому не должно быть особых накладных расходов.

Учитывая, что это довольно маленькая функция, вы можете профилировать обе функции и посмотреть, есть ли какая-либо разница.

...