1

我正在尝试通过 MAGMA 库的“magma_dgels_gpu()”函数解决最小二乘问题。我的 GPU 是“Tesla C2050 / C2075”,我已经安装了 MAGMA。

我正在尝试编译以下代码“testMagmaDGELS.cu”,但出现错误:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <cuda.h>
#include <cuda_runtime_api.h>
#include <cublas.h>

#include "magma.h"

#define UTILS_MALLOC(__ptr, __type, __size)                           \
  __ptr = (__type*)malloc((__size) * sizeof(__type));                 \
  if (__ptr == 0) {                                                   \
    fprintf (stderr, "!!!! Malloc failed for: %s\n", #__ptr );        \
    exit(-1);                                                         \
  }

#define UTILS_DEVALLOC(__ptr, __type, __size)                                 \
  if( cudaSuccess != cudaMalloc( (void**)&__ptr, (__size)*sizeof(__type) ) ){ \
    fprintf (stderr, "!!!! cudaMalloc failed for: %s\n", #__ptr );            \
    exit(-1);                                                                 \
  }

int main(int argc, char** argv)
{
    if( CUBLAS_STATUS_SUCCESS != cublasInit( ) ) {
        fprintf(stderr, "CUBLAS: Not initialized\n"); exit(-1);
    }

    double *devA, *devB, *pWork, lWorkQuery[1];
    const int M = 5, N = 3;

    int ret, info;

    /* Allocate device memory for the matrix (column-major) */
    int lda  = M;
    int ldda = ((M + 31) / 32) * 32;
    UTILS_DEVALLOC(devA, double, ldda * N);
    UTILS_DEVALLOC(devB, double, M);

    /* Initialize the matrix */
    double A[N][M] = {{ 0.6,  5.0,  1.0, -1.0, -4.2 },
                      { 1.2,  4.0, -4.0, -2.0, -8.4 },
                      { 3.9,  2.5, -5.5, -6.5, -4.8 }};
    cublasSetMatrix(M, N, sizeof(double), A, lda, devA, ldda);

    double B[M] = {3.0, 4.0, -1.0, -5.0, -1.0};
    cublasSetMatrix(M, 1, sizeof(double), B, M, devB, M);

    /* Resolve the LLSP using MAGMA */
    ret = magma_dgels_gpu('N', M, N, 1 /* nb of colums in the matrix B */,
                           devA, ldda, devB, M,
                           lWorkQuery, -1, // query the optimal work space
                           &info);
    if (info < 0) {
        printf("Argument %d of magma_dgels_gpu had an illegal value.\n", -info);
        exit(1);
    } else if (ret != MAGMA_SUCCESS) {
        printf("magma_dgels_gpu failed (code %d).\n", ret);
        exit(1);
    }

    int lwork = (int)lWorkQuery[0];
    printf("Optimal work space %d\n", lwork);
    UTILS_MALLOC(pWork, double, lwork);

    ret = magma_dgels_gpu('N', M, N, 1 /* nb of colums in the matrix B */,
                           devA, ldda, devB, M,
                           pWork, lwork,
                           &info);
    if (info < 0) {
        printf("Argument %d of magma_dgels_gpu had an illegal value.\n", -info);
        exit(1);
    } else if (ret != MAGMA_SUCCESS) {
        printf("magma_dgels_gpu failed (code %d).\n", ret);
        exit(1);
    } else {
        printf("LLSP solved successfully\n");
    }

    cublasGetMatrix(M, 1, sizeof(double), devB, M, B, M);

    /* Expected solution vector: 0.953333 -0.843333 0.906667 */
    printf("Solution vector:\n");
    for (int i = 0; i < N; i++) {
        printf("\t%lf\n", B[i]);
    }

    /* Memory clean up */
    free( pWork );
    cudaFree( devA );
    cudaFree( devB );

    /* Shutdown */
    cublasShutdown();

    return 0;
}

我编译如下:

nvcc -arch=sm_20 testMagmaDGELS.cu -o testMagmaDGELS -lcublas -I/opt/magma/1.7.0/openblas/gcc/include

我得到这些错误:

team24@tesla:~$ nvcc -arch=sm_20 testMagmaDGELS.cu -o testMagmaDGELS -lcublas -I/opt/magma/1.7.0/openblas/gcc/include
testMagmaDGELS.cu(54): error: argument of type "char" is incompatible with parameter of type "magma_trans_t"

testMagmaDGELS.cu(70): error: argument of type "char" is incompatible with parameter of type "magma_trans_t"

2 errors detected in the compilation of "/tmp/tmpxft_00002d95_00000000-8_testMagmaDGELS.cpp1.ii".

有人可以帮我吗?

4

1 回答 1

2

使用岩浆类型来指示转置/无转置,而不是使用char类型。

所以而不是这个:

ret = magma_dgels_gpu('N', ...

做这个:

magma_trans_t my_trans = MagmaNoTrans;

ret = magma_dgels_gpu(my_trans, ...

请参阅此处的文档。

magma_trans_t magma_trans_const ( character ) 将“N”、“T”、“C”映射到 MagmaNoTrans、MagmaTrans、MagmaConjTrans

于 2016-01-15T19:01:36.393 回答