Представлен Aparapi - API для написание OpenCL-ядер на Java

Aparapi - новое API языка программирования JAVA для написания и выполнения OpenCL-ядер на графических акселераторах компании AMD. Если целевая платформа поддерживает OpenCL, то байткод будет проанализирован "на лету" и в случае отсутствия неконвертируемого в OpenCL кода, он транслируется в OpenCL, компилируется и запускается на GPU (если подходящий GPU присутствует). В противном случае, код будет запущен как обычный байткод на CPU. 

 На данный момент для использования Aparapi требуется: 

  • ATI Stream SDK версии 2.2 и выше;
  • Microsoft Windows 7, Windows Vista SP2 или Windows XP SP3 (все пока что только 32-битные);
  • JDK (32-битный ввиду 32-битной платформы);
  • GPU от AMD из данного списка.

Для написания Java-ядра с использованием Aparapi создается класс, наследуемый от специального класса Kernel. Данный класс инкапсулирует алгоритмы параллелизма по данным, которые будут выполняться либо на GPU (в результате конвертации в OpenCL-код), либо на CPU посредством Java Thread Pool.

Далее показан пример такого класса-ядра для вычисления квадратов чисел из некоторого множеста.

class SquareKernel extends Kernel
{
         private int values[];
         private int squares[];
 
         public SquareKernel(int values[]){
            this.values = values;
            squares = new int[values.length];
         }
 
         public void run() {
             int gid = getGlobalID();
             squares[gid] = values[gid]*values[gid];
         }
 
         public int[] getSquares(){
             return(squares);
         }
}

Для выполнения этого ядра создается экземпляр данного класса и вызывается метод execute().

int[] values = new int[1024];
 
// Здесь инициализируются значения массива ...
 
SquareKernel kernel = new SquareKernel(values);
kernel.execute(values.length);

Метод execute() неявно вызовет  run()  и к моменту завершения execute() ядро будет уже рассчитано. Результаты можно получить так: 

int[] squares = kernel.getSquares();
for (int i=0; i< values.length; i++){
        System.out.printf("%4d %4d %8d\n", i, values[i], squares[i]);
} 



Ссылки по теме новости:

  • Официальная страница Aparapi на developer.amd.com
  • ATI Stream SDK 
  • Форум на amd.com, посвященный применению OpenCL