JCuda: делать параллельные арифметические операции над массивами? - PullRequest
1 голос
/ 28 января 2011

Я просто не могу найти примеры для JCuda для одной из самых простых задач: добавить два массива значений в третий массив.

Я всегда нахожу только примеры C / C ++, которые основаны на каком-то CUDA-прекомпиляторе, поэтому для меня они непригодны. Там происходят страшные вещи, такие как:

VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N)

Ну, в библиотеках JCuda нет ничего похожего на VecAdd.

В JCuda есть множество под-библиотек, таких как JCudpp, JCublas, ... Я действительно не знаю , где искать и что .

Пожалуйста, помогите!

Ответы [ 3 ]

2 голосов
/ 28 января 2011

Мне удалось собрать рабочий пример:

Источник

import java.util.*;

import jcuda.*;
import static jcuda.jcublas.JCublas.*;

public class Main {

  private static final int VECTOR_SIZE = 10;

  static {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

      @Override
      public void run() {
        cublasShutdown();
      }

    }));

    cublasInit();
  }

  static void printArrays(float[] a1, float[] a2) {
    System.out.println("\t" + Arrays.toString(a1));
    System.out.println("\t" + Arrays.toString(a2));
    System.out.println();
  }

  public static void main(String[] args) {
    float[] a1 = new float[VECTOR_SIZE];
    float[] a2 = new float[VECTOR_SIZE];

    for (int i = 0; i < VECTOR_SIZE; ++i) {
      a1[i] = i + 1;
    }

    Pointer p1 = new Pointer();
    Pointer p2 = new Pointer();

    cublasAlloc(VECTOR_SIZE, Sizeof.FLOAT, p1);
    cublasAlloc(VECTOR_SIZE, Sizeof.FLOAT, p2);

    System.out.println("BEFORE:");
    printArrays(a1, a2);

    cublasSetVector(VECTOR_SIZE, Sizeof.FLOAT, Pointer.to(a1), 1, p1, 1);
    cublasSetVector(VECTOR_SIZE, Sizeof.FLOAT, Pointer.to(a2), 1, p2, 1);

    // THE ACTUAL OPERATION: MULTIPLY AND ADD
    cublasSaxpy(VECTOR_SIZE, 20f, p1, 1, p2, 1);

    cublasGetVector(VECTOR_SIZE, Sizeof.FLOAT, p2, 1, Pointer.to(a2), 1);

    System.out.println("AFTER:");
    printArrays(a1, a2);

    cublasFree(p1);
    cublasFree(p2);
  }

}

выход

BEFORE:
    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

AFTER:
    [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
    [20.0, 40.0, 60.0, 80.0, 100.0, 120.0, 140.0, 160.0, 180.0, 200.0]

Примечание

Теперь я поиграюсь с AMD Aparapi.

1 голос
/ 28 января 2011

Я бы играл с JCublas . Благодаря этому вы сможете использовать CUBLAS, реализацию NVIDIA CUDA подпрограмм Basic Linear Algebra в приложениях Java.

Пример, приведенный на следующей странице: http://www.jcuda.de/jcuda/jcudpp/JCudpp.html довольно завершен.

0 голосов
/ 28 января 2011

Вы можете использовать функцию VecAdd, написанную на C / C ++.Кажется, что JCuda может загружать только кубин-файлы, что имеет смысл, поскольку код cuda даже не создается компилятором C.Таким образом, вы можете использовать встроенные функции в JCublas или создать функцию в C и создать файл кубина.Эта функция может быть запущена в JCuda.

...