2016-11-07 67 views
0

在JCublas2.cublasSdot的源代码注释中,它被评论为'result'参数可以是'主机或设备指针'。JCuda的JCublas2.cublasSdot:未能使用设备指针作为结果指针参数

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方法,结果指针用/ **主机或设备指针** /?注释。

+0

非常感谢,马可。我稍后再试。 – Tom

+0

这完全解决了这个问题。 – Tom

回答

1

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);