From 158bb1bee9951875dbe3474d84c6663431e18301 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Tue, 21 Oct 2014 21:49:18 +0000
Subject: [PATCH] softmax on gpu
---
src/gemm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 44 insertions(+), 16 deletions(-)
diff --git a/src/gemm.c b/src/gemm.c
index 1a7bcdd..fa78daf 100644
--- a/src/gemm.c
+++ b/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
--
Gitblit v1.10.0