Java JCuda:对数组执行并行算术运算?
对于一项最简单的任务,我就是找不到Java JCuda:对数组执行并行算术运算?,java,cuda,parallel-processing,Java,Cuda,Parallel Processing,对于一项最简单的任务,我就是找不到JCuda的例子:将两个值数组添加到第三个数组 我总是只找到C/C++示例,它们依赖于一些CUDA预编译器,因此对我来说是不可用的。那里会发生可怕的事情,例如: VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N) VecAdd(d_A,d_B,d_C,N) 嗯,在JCuda库中没有类似于VecAdd的东西 JCuda中有许多子库,例如JCudpp,JCu
JCuda
的例子:将两个值数组添加到第三个数组
我总是只找到C/C++示例,它们依赖于一些CUDA预编译器,因此对我来说是不可用的。那里会发生可怕的事情,例如:
VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N)
VecAdd(d_A,d_B,d_C,N)
嗯,在JCuda库中没有类似于VecAdd
的东西
JCuda中有许多子库,例如JCudpp
,JCublas
。。。我真的不知道去哪里寻找什么
请帮忙我会玩JCublas。多亏了这个,你才能使用java语言的Java语言,英伟达的CUDA实现。p>
下页提供的示例:非常完整。我成功地组装了一个工作示例: 来源 注
现在我将使用。您可以使用用C/C++编写的VecAdd函数。JCuda似乎只能加载cubin文件,这是有道理的,因为cuda代码甚至不是由C编译器创建的。因此,您可以使用JCublas中的内置函数,或者在C中创建函数并创建cubin文件。此功能可以在JCuda中启动。谢谢!我设法从不同的例子中找到了一个我理解的解决方案。我会在单独的回答中发布。太好了!我很高兴这有帮助。
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]