【问题标题】:JCuda: doing parallel arithmetic operations on arrays?JCuda:对数组进行并行算术运算?
【发布时间】:2011-01-27 22:30:56
【问题描述】:

我只是找不到JCuda 的示例来完成一项最简单的任务:将两个值数组添加到第三个数组中。

我总是只找到 C/C++ 示例,这些示例依赖于一些 CUDA 预编译器,因此对我来说无法使用。可怕的事情发生在那里,例如:

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

嗯,在 JCuda 库中没有类似于 VecAdd 的东西。

JCuda里面有很多子库,比如JCudppJCublas,……我真的不知道去哪里什么。

请帮忙!

【问题讨论】:

    标签: java cuda parallel-processing


    【解决方案1】:

    我设法组装了一个工作示例:

    来源

    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

    【讨论】:

      【解决方案2】:

      我会和 JCublas 一起玩。因此,您将能够在 Java 应用程序中使用 CUBLAS,这是 Basic Linear Algebra Subprograms 的 NVIDIA CUDA 实现。

      以下页面提供的示例:http://www.jcuda.de/jcuda/jcudpp/JCudpp.html 非常完整。

      【讨论】:

      • 谢谢!我设法找到了一个我理解的解决方案,由不同的例子组合而成。我将在单独的答案中发布。
      • 太棒了!我很高兴这有帮助。
      【解决方案3】:

      您可以使用用 C/C++ 编写的 VecAdd 函数。似乎 JCuda 只能加载 cubin 文件,这是有道理的,因为 cuda 代码甚至不是由 C 编译器创建的。因此,您可以使用 JCublas 中的内置函数或在 C 中创建一个函数并创建一个 cubin 文件。这个功能可以在JCuda中启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-02
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        相关资源
        最近更新 更多