JCuda 的 JCublas2.cublasSdot:未能使用设备指针作为结果指针参数



在JCublas2的源代码注释中。cublasSdot,注释说'result'参数可以是'主机或设备指针'。

 public static int cublasSdot(
    cublasHandle handle, 
    int n, 
    Pointer x, 
    int incx, 
    Pointer y, 
    int incy, 
    Pointer result)/** host or device pointer */
{
    return checkResult(cublasSdotNative(handle, n, x, incx, y, incy, result));
}

然而,我可以只使用主机指针,如pointer .to(fs), float[] fs ={0}。如果我使用一个设备指针,比如'CUdeviceptr devicePtr = new CUdeviceptr();JCudaDriver。cuMemAlloc(devicePtr, 100 * Sizeof.FLOAT);',程序崩溃并显示如下控制台消息:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fed93af2a3, pid=9376, tid=0x0000000000003a7c
# .....

减少主机和设备之间的数据传输,节省时间。如何使用设备指针作为这个方法的"结果"参数,以及其他JCuda方法与结果指针注释与/**主机或设备指针**/?

CUBLAS可以将某些计算结果(如点积)写入主机设备内存。目标内存类型必须使用cublasSetPointerMode显式设置。

JCublas2PointerModes示例中显示了如何使用它的示例。

它一次将点积计算的结果写入主机内存(当没有显式设置指针模式时,这也是默认值):

// Set the pointer mode to HOST
cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_HOST);
// Prepare the pointer for the result in HOST memory
float hostResult[] = { -1.0f };
Pointer hostResultPointer = Pointer.to(hostResult);
// Execute the 'dot' function
cublasSdot(handle, n, deviceData, 1, deviceData, 1, hostResultPointer);

然后改变指针模式并再次调用该函数,这次将结果写入设备内存:

cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_DEVICE);
// Prepare the pointer for the result in DEVICE memory
Pointer deviceResultPointer = new Pointer();
cudaMalloc(deviceResultPointer, Sizeof.FLOAT);
// Execute the 'dot' function
cublasSdot(handle, n, deviceData, 1, deviceData, 1, deviceResultPointer);

相关内容

  • 没有找到相关文章

最新更新