Невозможно получить правильный вывод для magma_dgeqrf_batched - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь запустить плотную пакетную QR-факторизацию в GPU, я смог успешно запустить пакетный код dgeqrf CUBLAS, но когда я выполнил те же шаги для пакетного кода magma dgeqrf, я не получил правильный вывод.Я публикую код, в котором я использовал пакетный код magma dgeqrf для выполнения пакетного QR.Может кто-нибудь сказать мне, где я ошибся в этом коде ниже?Спасибо

int main() {

//mxn: size of Array[i]

const int m = 3;
const int n = 2;
const int batchSize = 2;//2 small matrices
//const int ltau = 10; //ltau = max(1,min(m,n))
int lda = 3;


double **A,**tau;

A = (double**)malloc(batchSize * sizeof(double*));
for (int i = 0; i < batchSize; i++) {
    A[i] = (double*)malloc(m*n * sizeof(double));
}


tau = (double**)malloc(batchSize * sizeof(double*));        
for (int i = 0; i < batchSize; i++) 
{
        tau[i] = (double*)malloc(n * sizeof(double));
}
  int *info;
info = (int*)malloc(batchSize * sizeof(int));



double **d_A, **h_d_A;
h_d_A = (double**)malloc(batchSize * sizeof(double*));

for (int i = 0; i < batchSize; i++) {
    cudaMalloc((void**)&h_d_A[i], m*n * sizeof(double));

}

cudaMalloc((void**)&d_A, batchSize * sizeof(double*));
cudaMemcpy(d_A, h_d_A, batchSize * sizeof(double*), cudaMemcpyHostToDevice);

for (int k = 0; k < batchSize; k++) {
    for (int j = 0; j < n; j++) {
        for (int i = 0; i < m; i++) {
            int index = j * m + i;//not tested
            if (i == j) {
                (A[k])[index] = 2;
            }
            else {
                (A[k])[index] = 1.0;

            }
        } // i  
    } // j
} // k



for (int i = 0; i < batchSize; i++)
{
    cudaMemcpy(h_d_A[i], A[i], m *n * sizeof(double), cudaMemcpyHostToDevice);

}
magma_queue_t queue; 

magma_queue_create( &queue);

magma_dgeqrf_batched( m, n, d_A, lda, tau, info, batchSize,queue);

for (int i = 0; i < batchSize; i++)
    cudaMemcpy(A[i], h_d_A[i], m*n * sizeof(double), cudaMemcpyDeviceToHost);



for (int k = 0; k < batchSize; k++) {
    for (int j = 0; j < m; j++) {
        for (int i = 0; i < n; i++) {
            int index = j * m + i;//not tested
            //count = count + 1;
            printf("\n %d The values are %lf",k+index, A[k][index]);
        } // i
    } // j
} // k

free(tau);
free(A);
free(h_d_A);

cudaFree(d_A);

} `

...