如何使用 JCuda 在 CPU 和 GPU 上执行相同的功能
How to execute this same function on CPU and GPU with JCuda
我处理 JCuda 文档中的代码。目前,它只是在 GPU 上添加向量。
我应该怎么做才能在 CPU(主机)上重用函数 add
?
我知道,我必须将 __global__
更改为 __host__ __device__
但我不知道如何在我的主要功能中调用它。我怀疑我必须使用另一个 nvcc 选项。
我的目标是 运行 在 GPU 和 CPU 上实现相同的功能并检查执行时间(我知道如何检查)。
.cu 文件(用nvcc -ptx file.cu -o file.ptx
编译
extern "C"
__global__ void add(int n, float *a, float *b, float *sum)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i<n)
{
sum[i] = a[i] + b[i];
}
}
主函数片段
public static void main(String[] args) {
cuInit(0);
CUdevice device = new CUdevice();
cuDeviceGet(device, 0);
CUcontext context = new CUcontext();
cuCtxCreate(context, 0, device);
CUmodule module = new CUmodule();
cuModuleLoad(module, "kernels/JCudaVectorAdd.ptx");
CUfunction function = new CUfunction();
cuModuleGetFunction(function, module, "add");
...
Pointer kernelParameters = Pointer.to(
Pointer.to(new int[]{numElements}),
Pointer.to(deviceInputA),
Pointer.to(deviceInputB),
Pointer.to(deviceOutput)
);
你不能也可能永远无法在 JCUDA 中执行此操作,因为它使用 API 接口与 CUDA 交互。
虽然 CUDA 现在可以 "launch" 将主机函数转换为流,但 JCUDA 目前尚未公开 API,并且它不会像设备代码现在那样工作(此限制也适用于 PyCUDA 和其他基于驱动程序 API 的框架。
您可能需要使用 JNI 或其他方式从库中检索主机函数并以这种方式调用它。
我处理 JCuda 文档中的代码。目前,它只是在 GPU 上添加向量。
我应该怎么做才能在 CPU(主机)上重用函数 add
?
我知道,我必须将 __global__
更改为 __host__ __device__
但我不知道如何在我的主要功能中调用它。我怀疑我必须使用另一个 nvcc 选项。
我的目标是 运行 在 GPU 和 CPU 上实现相同的功能并检查执行时间(我知道如何检查)。
.cu 文件(用nvcc -ptx file.cu -o file.ptx
extern "C"
__global__ void add(int n, float *a, float *b, float *sum)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i<n)
{
sum[i] = a[i] + b[i];
}
}
主函数片段
public static void main(String[] args) {
cuInit(0);
CUdevice device = new CUdevice();
cuDeviceGet(device, 0);
CUcontext context = new CUcontext();
cuCtxCreate(context, 0, device);
CUmodule module = new CUmodule();
cuModuleLoad(module, "kernels/JCudaVectorAdd.ptx");
CUfunction function = new CUfunction();
cuModuleGetFunction(function, module, "add");
...
Pointer kernelParameters = Pointer.to(
Pointer.to(new int[]{numElements}),
Pointer.to(deviceInputA),
Pointer.to(deviceInputB),
Pointer.to(deviceOutput)
);
你不能也可能永远无法在 JCUDA 中执行此操作,因为它使用 API 接口与 CUDA 交互。
虽然 CUDA 现在可以 "launch" 将主机函数转换为流,但 JCUDA 目前尚未公开 API,并且它不会像设备代码现在那样工作(此限制也适用于 PyCUDA 和其他基于驱动程序 API 的框架。
您可能需要使用 JNI 或其他方式从库中检索主机函数并以这种方式调用它。