Получит ли мое трудоемкое Java-приложение пользу от Rootbeer, перенеся часть работы на GPU?
Мое Java-приложение читает тысячи текстовых файлов, проходит по строкам, анализирует текст в числах с плавающей точкой и выполняет некоторые вычисления с ними, а затем сохраняет результаты в некоторых файлах, теперь я использую несколько потоков для их одновременного выполнения, но мне все еще нужно час, чтобы запустить все приложение.
Вот упрощенная псевдо версия того, что делает мое приложение:
String Lines[]=ReadFile("abc.txt"),Items[];
float its[];
for (int i=0;i<Lines.length;i++)
{
Items=Lines[i].split(",");
its=new float[Items.length];
for (int j=0;j<its.length;j++) its[j]=Float.parseFloat(Items[j]);
do some calculation with : its[]
}
Do more calculation, save results to a StringBuffer.
Save StringBuffer to ("abc_result.txt");
Я читал, что Rootbeer может перенести некоторую рабочую нагрузку на GPU и ускорить процесс, поэтому мои вопросы:
[1] Может ли Rootbeer обрабатывать текстовые файлы и вводить / выводить файл на графическом процессоре? Или мне нужно, чтобы эта часть выполнялась на процессоре, а вычисления производились только на GPU?
[2] Мое приложение получит выгоду от Rootbeer?
1 ответ
Ответ, как это часто бывает: это зависит.
Rootbeer сможет перенести часть работы на GPU. Но есть много предостережений.
- Вы должны изучить совершенно новый способ ведения дел.
- Это может не ускорить это. Это скорее зависит от того, где узкое место в вашем приложении. Например, если ваша проблема связана с вводом / выводом, то обработка на GPU не поможет. Вы можете проверить это с помощью своего кода в его текущем состоянии, посмотрев на загрузку процессора во время работы вашего приложения. Если это занимает час, то, если ваши файлы не будут катастрофически огромными, это будет звучать так, как будто оно связано с процессором.
- (Это самое важное предупреждение.) Вам следует начать с оптимизации имеющегося у вас кода и проверки того, сколько места можно улучшить. Обработка на GPU, по сути, просто добавляет больше мощности для решения проблемы; Это хорошая идея, если и только если ваш код уже работает оптимально.
Теперь, по всей видимости, большая часть обработки в вашем приложении связана с обработкой строк. Вы вызываете .split()
на String
, который разбивает его на String[]
; Затем вы идете через биты и читаете каждый из них, чтобы преобразовать в float
; тогда вы делаете ваши расчеты. Это довольно тяжелая работа, особенно над сборщиком мусора, который должен избавиться от всех этих String
s.
В этом вопросе я провел подробный анализ чего-то очень похожего, используя целые числа вместо числа с плавающей запятой, и это привело к некоторому подробному обсуждению. Был сделан вывод, что было очень важно отказаться от String
на основе подхода и чтения файлов по символам, превращая их вручную в целые числа. Почти наверняка что-то очень похожее поможет вам в создании чисел с плавающей запятой.
Короче говоря, Rootbeer может помочь, но вы можете многое сделать, прежде чем попробовать что-то радикальное.