JCuda 的 JCublas2.cublasSdot: 未能将设备指针用于结果指针参数
JCuda's JCublas2.cublasSdot: failed to use a device Pointer for the result Pointer parameter
在JCublas2.cublasSdot的源码注释中,注释'result'参数可以是'host or device pointer'.
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
# .....
主机和设备之间的数据传输最小化可以节省时间。如何使用设备指针作为此方法的 'result' 参数,以及其他 JCuda 方法的结果指针用 /** 主机或设备指针 **/ 注释?
CUBLAS 可以将某些计算的结果(如点积)写入 host 或 device 内存。必须明确设置目标内存类型,使用 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);
在JCublas2.cublasSdot的源码注释中,注释'result'参数可以是'host or device pointer'.
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
# .....
主机和设备之间的数据传输最小化可以节省时间。如何使用设备指针作为此方法的 'result' 参数,以及其他 JCuda 方法的结果指针用 /** 主机或设备指针 **/ 注释?
CUBLAS 可以将某些计算的结果(如点积)写入 host 或 device 内存。必须明确设置目标内存类型,使用 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);