Joseph Redmon
2014-10-21 158bb1bee9951875dbe3474d84c6663431e18301
src/gemm.c
@@ -1,4 +1,5 @@
#include "mini_blas.h"
#include <clBLAS.h>
void gemm(int TA, int TB, int M, int N, int K, float ALPHA, 
        float *A, int lda, 
@@ -6,11 +7,7 @@
        float BETA,
        float *C, int ldc)
{
#ifdef GPU
    gemm_gpu( TA,  TB,  M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc);
#else
    gemm_cpu( TA,  TB,  M, N, K, ALPHA,A,lda, B, ldb,BETA,C,ldc);
#endif
}
void gemm_nn(int M, int N, int K, float ALPHA, 
@@ -39,7 +36,7 @@
        for(j = 0; j < N; ++j){
            register float sum = 0;
            for(k = 0; k < K; ++k){
                sum += ALPHA*A[i*lda+k]*B[k+j*ldb];
                sum += ALPHA*A[i*lda+k]*B[j*ldb + k];
            }
            C[i*ldc+j] += sum;
        }
@@ -61,6 +58,7 @@
        }
    }
}
void gemm_tt(int M, int N, int K, float ALPHA, 
        float *A, int lda, 
        float *B, int ldb,
@@ -69,9 +67,11 @@
    int i,j,k;
    for(i = 0; i < M; ++i){
        for(j = 0; j < N; ++j){
            register float sum = 0;
            for(k = 0; k < K; ++k){
                C[i*ldc+j] += ALPHA*A[i+k*lda]*B[k+j*ldb];
                sum += ALPHA*A[i+k*lda]*B[k+j*ldb];
            }
            C[i*ldc+j] += sum;
        }
    }
}
@@ -83,6 +83,7 @@
        float BETA,
        float *C, int ldc)
{
    //printf("cpu: %d %d %d %d %d %f %d %d %f %d\n",TA, TB, M, N, K, ALPHA, lda, ldb, BETA, ldc);
    int i, j;
    for(i = 0; i < M; ++i){
        for(j = 0; j < N; ++j){
@@ -107,7 +108,11 @@
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#ifdef __APPLE__
#define BLOCK 1
#else
#define BLOCK 8
#endif
cl_kernel get_gemm_kernel()
{
@@ -120,6 +125,12 @@
    return gemm_kernel;
}
void gemm_ongpu_old(int TA, int TB, int M, int N, int K, float ALPHA,
        cl_mem A_gpu, int lda,
        cl_mem B_gpu, int ldb,
        float BETA,
        cl_mem C_gpu, int ldc);
void gemm_ongpu(int TA, int TB, int M, int N, int K, float ALPHA, 
        cl_mem A_gpu, int lda, 
        cl_mem B_gpu, int ldb,
@@ -127,6 +138,19 @@
        cl_mem C_gpu, int ldc)
{
    cl_setup();
    //cl.error = clblasSgemm(clblasRowMajor, TA?clblasTrans:clblasNoTrans, TB?clblasTrans:clblasNoTrans,M, N, K,ALPHA, A_gpu, 0, lda,B_gpu, 0, ldb,BETA, C_gpu, 0, ldc,1, &queue, 0, NULL, &event);
    //check_error(cl);
    gemm_ongpu_old(TA, TB, M, N, K, ALPHA, A_gpu, lda, B_gpu, ldb, BETA, C_gpu, ldc);
}
void gemm_ongpu_old(int TA, int TB, int M, int N, int K, float ALPHA,
        cl_mem A_gpu, int lda,
        cl_mem B_gpu, int ldb,
        float BETA,
        cl_mem C_gpu, int ldc)
{
    //printf("gpu: %d %d %d %d %d\n",TA, TB, M, N, K);
    cl_setup();
    cl_kernel gemm_kernel = get_gemm_kernel();
    cl_command_queue queue = cl.queue;
@@ -211,11 +235,11 @@
    float *c = random_matrix(m,n);
    int i;
    clock_t start = clock(), end;
    for(i = 0; i<1000; ++i){
    for(i = 0; i<10; ++i){
        gemm_gpu(TA,TB,m,n,k,1,a,lda,b,ldb,1,c,n);
    }
    end = clock();
    printf("Matrix Multiplication %dx%d * %dx%d, TA=%d, TB=%d: %lf ms\n",m,k,k,n, TA, TB, (float)(end-start)/CLOCKS_PER_SEC);
    printf("Matrix Multiplication %dx%d * %dx%d, TA=%d, TB=%d: %lf s\n",m,k,k,n, TA, TB, (float)(end-start)/CLOCKS_PER_SEC);
    free(a);
    free(b);
    free(c);
@@ -256,6 +280,8 @@
void test_gpu_blas()
{
    test_gpu_accuracy(0,0,10,576,75);
    test_gpu_accuracy(0,0,17,10,10); 
    test_gpu_accuracy(1,0,17,10,10); 
    test_gpu_accuracy(0,1,17,10,10); 
@@ -266,17 +292,19 @@
    test_gpu_accuracy(0,1,1000,10,100); 
    test_gpu_accuracy(1,1,1000,10,100); 
    time_gpu_random_matrix(0,0,1000,1000,100);
    time_random_matrix(0,0,1000,1000,100);
    /*
       time_gpu_random_matrix(0,0,1000,1000,100);
       time_random_matrix(0,0,1000,1000,100);
    time_gpu_random_matrix(0,1,1000,1000,100);
    time_random_matrix(0,1,1000,1000,100);
       time_gpu_random_matrix(0,1,1000,1000,100);
       time_random_matrix(0,1,1000,1000,100);
    time_gpu_random_matrix(1,0,1000,1000,100);
    time_random_matrix(1,0,1000,1000,100);
       time_gpu_random_matrix(1,0,1000,1000,100);
       time_random_matrix(1,0,1000,1000,100);
    time_gpu_random_matrix(1,1,1000,1000,100);
    time_random_matrix(1,1,1000,1000,100);
       time_gpu_random_matrix(1,1,1000,1000,100);
       time_random_matrix(1,1,1000,1000,100);
     */
}
#endif