JCuda + GEForce Gt640 问题:
在 GPU 计算出结果后,我试图减少与将内存从设备复制到主机相关的延迟。执行简单的 Vector Add 程序,我发现大部分延迟确实是将结果缓冲区复制回主机端。源缓冲区到设备端的传输延迟可以忽略不计 ~.30 毫秒,而将结果复制回大约 20 毫秒。
我进行了研究,发现复制结果的更好替代方法是使用固定内存。据我所知,这个内存是在主机端分配的,但内核可以通过 pci-e 直接访问它,从而产生比在批量计算后复制结果更高的速度。我正在使用以下示例,但结果并未达到我的预期。
内核:{用于说明要点的简单示例,仅启动 1 个块 1 个线程}
extern "C"
__global__ void add(int* test)
{
test[0]=1; test[1]=2; test[2]=3; test[3]=4; test[4]=5;
}
爪哇:
import java.io.*;
import jcuda.*;
import jcuda.runtime.*;
import jcuda.driver.*;
import static jcuda.runtime.cudaMemcpyKind.*;
import static jcuda.driver.JCudaDriver.*;
public class JCudaTest
{
public static void main(String args[])
{
// Initialize the driver and create a context for the first device.
cuInit(0);
CUdevice device = new CUdevice();
cuDeviceGet(device, 0);
CUcontext context = new CUcontext();
cuCtxCreate(context, 0, device);
// Load the ptx file.
CUmodule module = new CUmodule();
JCudaDriver.cuModuleLoad(module, "JCudaKernel.ptx");
// Obtain a function pointer to the kernel function.
CUfunction function = new CUfunction();
JCudaDriver.cuModuleGetFunction(function, module, "add");
Pointer P = new Pointer();
JCudaDriver.cuMemAllocHost(P, 5*Sizeof.INT);
Pointer kernelParameters = Pointer.to(P);
// Call the kernel function with 1 block, 1 thread:
JCudaDriver.cuLaunchKernel(function, 1, 1, 1, 1, 1, 1, 0, null, kernelParameters, null);
int [] T = new int[5];
JCuda.cudaMemcpy(Pointer.to(T), P, 5*Sizeof.INT, cudaMemcpyHostToHost);
// Print the results:
for(int i=0; i<5; i++)
System.out.println(T[i]);
}
}
1.) 构建内核:root@NVS295-CUDA:~/JCUDA/MySamples# nvcc -ptx JCudaKernel.cu root@NVS295-CUDA:~/JCUDA/MySamples# ls -lrt | grep ptx -rw-r--r-- 1 根根 3295 Mar 27 17:46 JCudaKernel.ptx
2.)构建Java:root@NVS295-CUDA:~/JCUDA/MySamples# javac -cp "../JCuda-All-0.5.0-bin-linux-x86/*:." JCudaTest.java
3.) 运行代码:root@NVS295-CUDA:~/JCUDA/MySamples# java -cp "../JCuda-All-0.5.0-bin-linux-x86/*:." JCudaTest 0 0 0 0 0
期待:1 2 3 4 5
注意:如果这很重要,我正在为 x86 使用 JCuda0.5.0。
请让我知道我做错了什么,并提前感谢:Ilir