0

我处理 JCuda 文档中的代码。目前,它只是在 GPU 上添加向量。我应该怎么做才能重用addCPU(主机)上的功能?我知道,我必须更改__global__为,__host__ __device__但我不知道如何在我的 main 函数中调用它。我怀疑我必须使用另一个 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)
        );
4

1 回答 1

2

您不能也可能永远无法在 JCUDA 中执行此操作,因为它使用了与 CUDA 交互的 API 接口。

虽然 CUDA 现在可以将主机函数“启动”到流中,但 JCUDA 目前并未公开该 API,并且它不会像现在设备代码那样工作(此限制将适用于 PyCUDA 和其他基于驱动程序 API框架)。

您可能需要使用 JNI 或其他方式从库中检索主机函数并以这种方式调用它。

于 2020-05-14T12:01:19.503 回答