1

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

ただし、float[] fs ={0} を指定した Pointer.to(fs) のようなホスト ポインターしか使用できません。「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 メソッドを使用する方法は?

4

1 に答える 1

2

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);
于 2016-11-08T15:31:57.877 に答える