cuBLAS argmin - segfault jeśli wyjście do pamięci urządzenia?

W cuBLAS,cublasIsamin() podaje argmin dla tablicy o pojedynczej precyzji.

Oto deklaracja pełnej funkcji:cublasStatus_t cublasIsamin(cublasHandle_t handle, int n, const float *x, int incx, int *result)

Przewodnik programisty cuBLAS dostarcza tych informacji na tematcublasIsamin() parametry:

Jeśli używamgospodarz (CPU) pamięć dlaresult, następniecublasIsamin działa poprawnie. Oto przykład:

void argmin_experiment_hostOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4; 
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int result; //host memory
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, &result));
    printf("argmin = %d, min = %f \n", result, h_A[result]);

    CHECK_CUBLAS(cublasDestroy(handle));
}

Jednak jeśli używamurządzenie (GPU) pamięć dlaresult, następniecublasIsamin segfaults. Oto przykład, że segfaults:

void argmin_experiment_deviceOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4;
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int* d_result = 0; 
    CHECK_CUDART(cudaMalloc((void**)&d_result, 1 * sizeof(d_result[0]))); //just enough device memory for 1 result
    CHECK_CUDART(cudaMemset(d_result, 0, 1 * sizeof(d_result[0])));
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, d_result)); //SEGFAULT!

    CHECK_CUBLAS(cublasDestroy(handle));
}
Przewodnik Nvidii mówi, że `cublasIsamin ()` może wysyłać do pamięci urządzenia. Co ja robię źle?

Motywacja: Chcę obliczyć argmin () kilku wektorów jednocześnie w wielu strumieniach. Wyjście do pamięci hosta wymaga synchronizacji CPU-GPU i wydaje się zabijać współbieżność wielu jąder. Chcę zamiast tego wypisać argmin do pamięci urządzenia.

questionAnswers(1)

yourAnswerToTheQuestion