首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JCuda:对数组执行并行算术操作?

JCuda:对数组执行并行算术操作?
EN

Stack Overflow用户
提问于 2011-01-27 22:30:56
回答 3查看 1.9K关注 0票数 2

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

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

代码语言:javascript
复制
VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N)

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

JCuda中有许多子库,如JCudppJCublas、.我真的不知道去哪里找,也不知道什么

,救命!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-27 23:49:53

我成功地组装了一个工作示例:

来源

代码语言:javascript
复制
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);
  }

}

输出

代码语言:javascript
复制
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一起玩了。

票数 3
EN

Stack Overflow用户

发布于 2011-01-27 22:51:11

我会和JCublas一起玩。因此,您将能够在Java应用程序中使用基本线性代数子程序的NVIDIA实现CUBLAS。

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

票数 1
EN

Stack Overflow用户

发布于 2011-01-27 23:50:44

您可以使用用C/C++编写的VecAdd函数。看来JCuda只能加载cubin文件,这是有意义的,因为cuda代码甚至不是由C编译器创建的。因此,您可以在JCublas中使用内置函数,也可以在C中创建一个函数,并创建一个库宾文件。这个函数可以在JCuda中启动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4822706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档