2014-04-10 2 views
0

Я пытаюсь написать программу калькулятора датчиков, и я хотел бы услышать от вас, ребята, как я могу улучшить время выполнения моей программы?Поиск самого быстрого способа вычисления больших матриц и вывода их?

Вкратце калькулятор датчиков представляет собой программу, которая выполняет умножение матрицы. Он мог получать 50 000 матриц в секунду. Первичное задание калькулятора датчиков - это получение матриц и вычисление их с помощью одной из 5 матриц, которые уже хранятся в программе.

Калькулятор датчиков имеет 5 методов, и каждый метод имеет собственную матрицу, которая умножается на полученную матрицу (параметр). И, конечно же, они возвращают полученную матрицу.

  1. У меня есть полностью 50 000 виртуальных цензоров на разных компьютерах.
  2. Каждый датчик отправляет каждую вторую матрицу в калькулятор (сервер) с UDP.
  3. Сервер, на котором размещается калькулятор датчика, получают матрицу и вычисляют ее.
  4. Сервер отправит результат на датчик (клиент) с UDP.

Все матрицы размером 10x10.

Например, первый метод:

public int[10][10] calculateWind(int[10][10] A){ 

int[10][10] C = new int[10][10]; // 

    for (int i = 0; i < 10; i++) { // Row 
     for (int j = 0; j < 10; j++) { // Column 
      for (int k = 0; k < 10; k++) { // Column 
       C[i][j] += A[i][k] * B[k][j];//B is constant matrix(private attribute) 
      } 
     } 
    } 

    return C;} 

Я использую Java, но кто-то сказал мне, что я мог бы использовать FORTRAN & C с Java, и это может помочь?

Я пытаюсь найти самый быстрый способ. Скажите мне, ребята, все, что вы думаете, что может помочь моей программе улучшить ее производительность. Изменение языка программирования? Использование уникального алгоритма?

Все советы приветствуются, за исключением использования ASSEMBLY и благодарности за ваш совет.

+0

Вы можете передать матрицу из Java в код C или Fortran через интерфейс Java Native Interface, JNI, как указано здесь: http://stackoverflow.com/questions/14725789/passing-a-2d-matrix-from-java -to-c-file-through-jni – ajm475du

+0

Есть ли какая-либо задержка для перехода из java в Fortran? – user3521129

+0

Существует некоторая задержка, но она имеет порядок квадрата числа строк в матрице. Время, затрачиваемое на вычисление матричного произведения, имеет тенденцию доминировать над этим, будучи порядка куба числа строк в матрице. Это правило, которое поможет вам. Чтобы точно знать, что вы хотите измерить. – ajm475du

ответ

0

Вы должны запустить программу в профайлер, чтобы найти точки доступа, а также измерить эффект ваши изменения.

Возможного улучшение переназначение ваших петель, чтобы свести к минимуму промахов кэша:

for (int i = 0; i < 10; i++) { 
    for (int k = 0; k < 10; k++) { 
     for (int j = 0; j < 10; j++) { 
      C[i][j] += A[i][k] * B[k][j]; 
     } 
    } 
} 

Для матриц, как малые, как ваши там вряд ли будут заметное улучшением, потому что все ваши данные помещаются в кэш процессора.

Использование C вряд ли даст какое-либо улучшение производительности. После нескольких итераций JIT скомпилирует код в native, и процессор работает по существу тем же самым кодом, который создавал компилятор C. Fortran может быть лучше благодаря автоматической векторизации, но разница, вероятно, невелика для матриц, которые являются такими маленькими.

0

Существуют библиотеки, которые реализуют матричное умножение с более быстрыми алгоритмами, чем простые три вложенные петли.

Рассмотрим этот ответ: Performance of Java matrix math libraries?

+0

спасибо за ответ. – user3521129

+0

Для матриц размером 10x10 служебные вызовы внешней библиотеки могут быть больше, чем вычислять продукт напрямую. – Joni

Смежные вопросы