summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/generator/generator/cpp.py11
-rw-r--r--scripts/generator/generator/routine.py2
-rw-r--r--src/utilities/utilities.hpp3
-rw-r--r--test/performance/client.cpp5
-rw-r--r--test/routines/level1/xamax.hpp2
-rw-r--r--test/routines/level1/xasum.hpp2
-rw-r--r--test/routines/level1/xaxpy.hpp2
-rw-r--r--test/routines/level1/xcopy.hpp2
-rw-r--r--test/routines/level1/xdot.hpp2
-rw-r--r--test/routines/level1/xdotc.hpp2
-rw-r--r--test/routines/level1/xdotu.hpp2
-rw-r--r--test/routines/level1/xnrm2.hpp2
-rw-r--r--test/routines/level1/xscal.hpp2
-rw-r--r--test/routines/level1/xswap.hpp2
-rw-r--r--test/routines/level2/xgbmv.hpp2
-rw-r--r--test/routines/level2/xgemv.hpp2
-rw-r--r--test/routines/level2/xger.hpp2
-rw-r--r--test/routines/level2/xgerc.hpp2
-rw-r--r--test/routines/level2/xgeru.hpp2
-rw-r--r--test/routines/level2/xhbmv.hpp2
-rw-r--r--test/routines/level2/xhemv.hpp2
-rw-r--r--test/routines/level2/xher.hpp2
-rw-r--r--test/routines/level2/xher2.hpp2
-rw-r--r--test/routines/level2/xhpmv.hpp2
-rw-r--r--test/routines/level2/xhpr.hpp2
-rw-r--r--test/routines/level2/xhpr2.hpp2
-rw-r--r--test/routines/level2/xsbmv.hpp2
-rw-r--r--test/routines/level2/xspmv.hpp2
-rw-r--r--test/routines/level2/xspr.hpp2
-rw-r--r--test/routines/level2/xspr2.hpp2
-rw-r--r--test/routines/level2/xsymv.hpp2
-rw-r--r--test/routines/level2/xsyr.hpp2
-rw-r--r--test/routines/level2/xsyr2.hpp2
-rw-r--r--test/routines/level2/xtbmv.hpp2
-rw-r--r--test/routines/level2/xtpmv.hpp2
-rw-r--r--test/routines/level2/xtrmv.hpp2
-rw-r--r--test/routines/level2/xtrsv.hpp2
-rw-r--r--test/routines/level3/xgemm.hpp2
-rw-r--r--test/routines/level3/xhemm.hpp2
-rw-r--r--test/routines/level3/xher2k.hpp2
-rw-r--r--test/routines/level3/xherk.hpp2
-rw-r--r--test/routines/level3/xsymm.hpp2
-rw-r--r--test/routines/level3/xsyr2k.hpp2
-rw-r--r--test/routines/level3/xsyrk.hpp2
-rw-r--r--test/routines/level3/xtrmm.hpp2
-rw-r--r--test/routines/level3/xtrsm.hpp2
-rw-r--r--test/routines/levelx/xaxpybatched.hpp2
-rw-r--r--test/routines/levelx/xgemmbatched.hpp2
-rw-r--r--test/wrapper_cublas.hpp914
-rw-r--r--test/wrapper_cuda.hpp96
50 files changed, 442 insertions, 677 deletions
diff --git a/scripts/generator/generator/cpp.py b/scripts/generator/generator/cpp.py
index 79d6b2a1..17e418e3 100644
--- a/scripts/generator/generator/cpp.py
+++ b/scripts/generator/generator/cpp.py
@@ -318,11 +318,9 @@ def wrapper_cublas(routine):
result += " " + scalar + "_cuda.y = " + scalar + ".imag();" + NL
# Calls the cuBLAS routine
- result += " cublasHandle_t handle;" + NL
- result += " if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }" + NL
result += " auto status = cublas" + flavour.name_cublas() + routine.name + "(handle, "
result += ("," + NL + indent).join([a for a in arguments]) + ");" + NL
- result += " cublasDestroy(handle);" + NL
+ result += " cudaDeviceSynchronize();" + NL
result += " return status;"
# There is no cuBLAS available, forward the call to one of the available functions
@@ -335,11 +333,10 @@ def wrapper_cublas(routine):
# result += " auto " + buf + "_buffer_bis = HalfToFloatBuffer(" + buf + "_buffer, queues[0]);" + NL
# # Call the float routine
- # result += " cublasHandle_t handle;" + NL
- # result += " auto status = cublasX" + routine.name + "(handle,"
+ # result += " return cublasX" + routine.name + "(handle,"
# result += ("," + NL + indent).join([a for a in routine.arguments_half()]) + ");" + NL
- # result += " cublasDestroy(handle);" + NL
- # result += " return status;" + NL
+ # result += " cudaDeviceSynchronize();" + NL
+ # result += " return status;"
# # Convert back to half
# for buf in routine.outputs:
diff --git a/scripts/generator/generator/routine.py b/scripts/generator/generator/routine.py
index a7abfde5..1c534611 100644
--- a/scripts/generator/generator/routine.py
+++ b/scripts/generator/generator/routine.py
@@ -884,6 +884,6 @@ class Routine:
if def_only:
result += flavour.name
result += ">\n"
- result += "cublasStatus_t cublasX" + self.name + template + "("
+ result += "cublasStatus_t cublasX" + self.name + template + "(cublasHandle_t handle, "
result += (",\n" + indent).join([a for a in self.arguments_def_wrapper_cublas(flavour)]) + ")"
return result
diff --git a/src/utilities/utilities.hpp b/src/utilities/utilities.hpp
index 7aadb983..b40ec541 100644
--- a/src/utilities/utilities.hpp
+++ b/src/utilities/utilities.hpp
@@ -193,6 +193,9 @@ struct Arguments {
size_t step = 1;
size_t num_steps = 0;
size_t num_runs = 10;
+ #ifdef CLBLAST_REF_CUBLAS
+ void* cublas_handle; // cublasHandle_t
+ #endif
// Common arguments
size_t platform_id = 0;
size_t device_id = 0;
diff --git a/test/performance/client.cpp b/test/performance/client.cpp
index a2f0f9f4..dc98ffbd 100644
--- a/test/performance/client.cpp
+++ b/test/performance/client.cpp
@@ -183,7 +183,7 @@ void Client<T,U>::PerformanceTest(Arguments<U> &args, const SetMetric set_sizes)
if (args.compare_clblas) { clblasSetup(); }
#endif
#ifdef CLBLAST_REF_CUBLAS
- cudaSetDevice(static_cast<int>(args.device_id));
+ if (args.compare_cublas) { cublasSetup(args); }
#endif
// Iterates over all "num_step" values jumping by "step" each time
@@ -272,6 +272,9 @@ void Client<T,U>::PerformanceTest(Arguments<U> &args, const SetMetric set_sizes)
#ifdef CLBLAST_REF_CLBLAS
if (args.compare_clblas) { clblasTeardown(); }
#endif
+ #ifdef CLBLAST_REF_CUBLAS
+ if (args.compare_cublas) { cublasTeardown(args); }
+ #endif
}
// =================================================================================================
diff --git a/test/routines/level1/xamax.hpp b/test/routines/level1/xamax.hpp
index dcd48a47..04bdaa3d 100644
--- a/test/routines/level1/xamax.hpp
+++ b/test/routines/level1/xamax.hpp
@@ -106,7 +106,7 @@ class TestXamax {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXamax(args.n,
+ auto status = cublasXamax(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.imax_offset,
buffers.x_vec, args.x_offset, args.x_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level1/xasum.hpp b/test/routines/level1/xasum.hpp
index e7e41fe5..6add9c64 100644
--- a/test/routines/level1/xasum.hpp
+++ b/test/routines/level1/xasum.hpp
@@ -106,7 +106,7 @@ class TestXasum {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXasum(args.n,
+ auto status = cublasXasum(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.asum_offset,
buffers.x_vec, args.x_offset, args.x_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level1/xaxpy.hpp b/test/routines/level1/xaxpy.hpp
index 98f0e380..17cae6ad 100644
--- a/test/routines/level1/xaxpy.hpp
+++ b/test/routines/level1/xaxpy.hpp
@@ -107,7 +107,7 @@ class TestXaxpy {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXaxpy(args.n, args.alpha,
+ auto status = cublasXaxpy(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level1/xcopy.hpp b/test/routines/level1/xcopy.hpp
index 65e498ee..7a5c99b8 100644
--- a/test/routines/level1/xcopy.hpp
+++ b/test/routines/level1/xcopy.hpp
@@ -106,7 +106,7 @@ class TestXcopy {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXcopy(args.n,
+ auto status = cublasXcopy(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level1/xdot.hpp b/test/routines/level1/xdot.hpp
index c95b16ef..1ea25994 100644
--- a/test/routines/level1/xdot.hpp
+++ b/test/routines/level1/xdot.hpp
@@ -113,7 +113,7 @@ class TestXdot {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXdot(args.n,
+ auto status = cublasXdot(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.dot_offset,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
diff --git a/test/routines/level1/xdotc.hpp b/test/routines/level1/xdotc.hpp
index 0c99be25..c800c1f5 100644
--- a/test/routines/level1/xdotc.hpp
+++ b/test/routines/level1/xdotc.hpp
@@ -113,7 +113,7 @@ class TestXdotc {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXdotc(args.n,
+ auto status = cublasXdotc(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.dot_offset,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
diff --git a/test/routines/level1/xdotu.hpp b/test/routines/level1/xdotu.hpp
index bf6bcd80..3545a3a6 100644
--- a/test/routines/level1/xdotu.hpp
+++ b/test/routines/level1/xdotu.hpp
@@ -113,7 +113,7 @@ class TestXdotu {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXdotu(args.n,
+ auto status = cublasXdotu(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.dot_offset,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
diff --git a/test/routines/level1/xnrm2.hpp b/test/routines/level1/xnrm2.hpp
index 096604d1..1db70537 100644
--- a/test/routines/level1/xnrm2.hpp
+++ b/test/routines/level1/xnrm2.hpp
@@ -106,7 +106,7 @@ class TestXnrm2 {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXnrm2(args.n,
+ auto status = cublasXnrm2(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.scalar, args.nrm2_offset,
buffers.x_vec, args.x_offset, args.x_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level1/xscal.hpp b/test/routines/level1/xscal.hpp
index 09b53839..efa0988d 100644
--- a/test/routines/level1/xscal.hpp
+++ b/test/routines/level1/xscal.hpp
@@ -100,7 +100,7 @@ class TestXscal {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXscal(args.n, args.alpha,
+ auto status = cublasXscal(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
}
diff --git a/test/routines/level1/xswap.hpp b/test/routines/level1/xswap.hpp
index 0d6fe451..d778cc23 100644
--- a/test/routines/level1/xswap.hpp
+++ b/test/routines/level1/xswap.hpp
@@ -106,7 +106,7 @@ class TestXswap {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXswap(args.n,
+ auto status = cublasXswap(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc);
if (status == CUBLAS_STATUS_SUCCESS) { return StatusCode::kSuccess; } else { return StatusCode::kUnknownError; }
diff --git a/test/routines/level2/xgbmv.hpp b/test/routines/level2/xgbmv.hpp
index 77abcfff..23138c77 100644
--- a/test/routines/level2/xgbmv.hpp
+++ b/test/routines/level2/xgbmv.hpp
@@ -126,7 +126,7 @@ class TestXgbmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXgbmv(args.layout,
+ auto status = cublasXgbmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.a_transpose),
args.m, args.n, args.kl, args.ku, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xgemv.hpp b/test/routines/level2/xgemv.hpp
index c0c59152..0ee53b80 100644
--- a/test/routines/level2/xgemv.hpp
+++ b/test/routines/level2/xgemv.hpp
@@ -126,7 +126,7 @@ class TestXgemv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXgemv(args.layout,
+ auto status = cublasXgemv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.a_transpose),
args.m, args.n, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xger.hpp b/test/routines/level2/xger.hpp
index 7fe37e1a..92a1a2ae 100644
--- a/test/routines/level2/xger.hpp
+++ b/test/routines/level2/xger.hpp
@@ -120,7 +120,7 @@ class TestXger {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXger(args.layout,
+ auto status = cublasXger(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
args.m, args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc,
diff --git a/test/routines/level2/xgerc.hpp b/test/routines/level2/xgerc.hpp
index b50cf672..5d899398 100644
--- a/test/routines/level2/xgerc.hpp
+++ b/test/routines/level2/xgerc.hpp
@@ -120,7 +120,7 @@ class TestXgerc {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXgerc(args.layout,
+ auto status = cublasXgerc(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
args.m, args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc,
diff --git a/test/routines/level2/xgeru.hpp b/test/routines/level2/xgeru.hpp
index 1ba83107..96dab22e 100644
--- a/test/routines/level2/xgeru.hpp
+++ b/test/routines/level2/xgeru.hpp
@@ -120,7 +120,7 @@ class TestXgeru {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXgeru(args.layout,
+ auto status = cublasXgeru(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
args.m, args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
buffers.y_vec, args.y_offset, args.y_inc,
diff --git a/test/routines/level2/xhbmv.hpp b/test/routines/level2/xhbmv.hpp
index 2faf86d9..b6844744 100644
--- a/test/routines/level2/xhbmv.hpp
+++ b/test/routines/level2/xhbmv.hpp
@@ -120,7 +120,7 @@ class TestXhbmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhbmv(args.layout,
+ auto status = cublasXhbmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.kl, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xhemv.hpp b/test/routines/level2/xhemv.hpp
index b2b6b337..e1f23592 100644
--- a/test/routines/level2/xhemv.hpp
+++ b/test/routines/level2/xhemv.hpp
@@ -120,7 +120,7 @@ class TestXhemv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhemv(args.layout,
+ auto status = cublasXhemv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xher.hpp b/test/routines/level2/xher.hpp
index c313d0f5..1ac1247b 100644
--- a/test/routines/level2/xher.hpp
+++ b/test/routines/level2/xher.hpp
@@ -113,7 +113,7 @@ class TestXher {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<U> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXher(args.layout,
+ auto status = cublasXher(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xher2.hpp b/test/routines/level2/xher2.hpp
index e60486a8..18ccc1ac 100644
--- a/test/routines/level2/xher2.hpp
+++ b/test/routines/level2/xher2.hpp
@@ -120,7 +120,7 @@ class TestXher2 {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXher2(args.layout,
+ auto status = cublasXher2(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xhpmv.hpp b/test/routines/level2/xhpmv.hpp
index 40ec5475..ad91fe15 100644
--- a/test/routines/level2/xhpmv.hpp
+++ b/test/routines/level2/xhpmv.hpp
@@ -120,7 +120,7 @@ class TestXhpmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhpmv(args.layout,
+ auto status = cublasXhpmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.ap_mat, args.ap_offset,
diff --git a/test/routines/level2/xhpr.hpp b/test/routines/level2/xhpr.hpp
index 986059bd..f9d580cd 100644
--- a/test/routines/level2/xhpr.hpp
+++ b/test/routines/level2/xhpr.hpp
@@ -113,7 +113,7 @@ class TestXhpr {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<U> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhpr(args.layout,
+ auto status = cublasXhpr(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xhpr2.hpp b/test/routines/level2/xhpr2.hpp
index 651989a4..f946ba5c 100644
--- a/test/routines/level2/xhpr2.hpp
+++ b/test/routines/level2/xhpr2.hpp
@@ -120,7 +120,7 @@ class TestXhpr2 {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhpr2(args.layout,
+ auto status = cublasXhpr2(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xsbmv.hpp b/test/routines/level2/xsbmv.hpp
index efcdbe34..6481d19b 100644
--- a/test/routines/level2/xsbmv.hpp
+++ b/test/routines/level2/xsbmv.hpp
@@ -120,7 +120,7 @@ class TestXsbmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsbmv(args.layout,
+ auto status = cublasXsbmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.kl, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xspmv.hpp b/test/routines/level2/xspmv.hpp
index c7d3d348..9815dbee 100644
--- a/test/routines/level2/xspmv.hpp
+++ b/test/routines/level2/xspmv.hpp
@@ -120,7 +120,7 @@ class TestXspmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXspmv(args.layout,
+ auto status = cublasXspmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.ap_mat, args.ap_offset,
diff --git a/test/routines/level2/xspr.hpp b/test/routines/level2/xspr.hpp
index 8d50074c..01a50c38 100644
--- a/test/routines/level2/xspr.hpp
+++ b/test/routines/level2/xspr.hpp
@@ -113,7 +113,7 @@ class TestXspr {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXspr(args.layout,
+ auto status = cublasXspr(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xspr2.hpp b/test/routines/level2/xspr2.hpp
index 2ee9538a..55f8a141 100644
--- a/test/routines/level2/xspr2.hpp
+++ b/test/routines/level2/xspr2.hpp
@@ -120,7 +120,7 @@ class TestXspr2 {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXspr2(args.layout,
+ auto status = cublasXspr2(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xsymv.hpp b/test/routines/level2/xsymv.hpp
index 9411fa8d..aec0dfb0 100644
--- a/test/routines/level2/xsymv.hpp
+++ b/test/routines/level2/xsymv.hpp
@@ -120,7 +120,7 @@ class TestXsymv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsymv(args.layout,
+ auto status = cublasXsymv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.a_mat, args.a_offset, args.a_ld,
diff --git a/test/routines/level2/xsyr.hpp b/test/routines/level2/xsyr.hpp
index 8c62f586..78b686d8 100644
--- a/test/routines/level2/xsyr.hpp
+++ b/test/routines/level2/xsyr.hpp
@@ -113,7 +113,7 @@ class TestXsyr {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsyr(args.layout,
+ auto status = cublasXsyr(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xsyr2.hpp b/test/routines/level2/xsyr2.hpp
index 80838174..38aa4f43 100644
--- a/test/routines/level2/xsyr2.hpp
+++ b/test/routines/level2/xsyr2.hpp
@@ -120,7 +120,7 @@ class TestXsyr2 {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsyr2(args.layout,
+ auto status = cublasXsyr2(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
args.n, args.alpha,
buffers.x_vec, args.x_offset, args.x_inc,
diff --git a/test/routines/level2/xtbmv.hpp b/test/routines/level2/xtbmv.hpp
index 9aff2cea..8c7aa381 100644
--- a/test/routines/level2/xtbmv.hpp
+++ b/test/routines/level2/xtbmv.hpp
@@ -116,7 +116,7 @@ class TestXtbmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtbmv(args.layout,
+ auto status = cublasXtbmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.diagonal),
diff --git a/test/routines/level2/xtpmv.hpp b/test/routines/level2/xtpmv.hpp
index e950b892..3afab978 100644
--- a/test/routines/level2/xtpmv.hpp
+++ b/test/routines/level2/xtpmv.hpp
@@ -116,7 +116,7 @@ class TestXtpmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtpmv(args.layout,
+ auto status = cublasXtpmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.diagonal),
diff --git a/test/routines/level2/xtrmv.hpp b/test/routines/level2/xtrmv.hpp
index a773b1ca..2b71f151 100644
--- a/test/routines/level2/xtrmv.hpp
+++ b/test/routines/level2/xtrmv.hpp
@@ -116,7 +116,7 @@ class TestXtrmv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtrmv(args.layout,
+ auto status = cublasXtrmv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.diagonal),
diff --git a/test/routines/level2/xtrsv.hpp b/test/routines/level2/xtrsv.hpp
index 4428271a..85b50e85 100644
--- a/test/routines/level2/xtrsv.hpp
+++ b/test/routines/level2/xtrsv.hpp
@@ -131,7 +131,7 @@ class TestXtrsv {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtrsv(args.layout,
+ auto status = cublasXtrsv(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.diagonal),
diff --git a/test/routines/level3/xgemm.hpp b/test/routines/level3/xgemm.hpp
index 36fa2f43..7e0ead6d 100644
--- a/test/routines/level3/xgemm.hpp
+++ b/test/routines/level3/xgemm.hpp
@@ -130,7 +130,7 @@ class TestXgemm {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXgemm(args.layout,
+ auto status = cublasXgemm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.b_transpose),
args.m, args.n, args.k, args.alpha,
diff --git a/test/routines/level3/xhemm.hpp b/test/routines/level3/xhemm.hpp
index 9400a1fc..a89617b5 100644
--- a/test/routines/level3/xhemm.hpp
+++ b/test/routines/level3/xhemm.hpp
@@ -130,7 +130,7 @@ class TestXhemm {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXhemm(args.layout,
+ auto status = cublasXhemm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.side),
convertToCUBLAS(args.triangle),
args.m, args.n, args.alpha,
diff --git a/test/routines/level3/xher2k.hpp b/test/routines/level3/xher2k.hpp
index 2b0fff64..55e6d894 100644
--- a/test/routines/level3/xher2k.hpp
+++ b/test/routines/level3/xher2k.hpp
@@ -132,7 +132,7 @@ class TestXher2k {
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<U> &args, BuffersCUDA<T> &buffers, Queue &) {
auto alpha2 = T{args.alpha, args.alpha};
- auto status = cublasXher2k(args.layout,
+ auto status = cublasXher2k(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
args.n, args.k, alpha2,
diff --git a/test/routines/level3/xherk.hpp b/test/routines/level3/xherk.hpp
index 3a676f59..3e1e7e02 100644
--- a/test/routines/level3/xherk.hpp
+++ b/test/routines/level3/xherk.hpp
@@ -118,7 +118,7 @@ class TestXherk {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<U> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXherk(args.layout,
+ auto status = cublasXherk(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
args.n, args.k, args.alpha,
diff --git a/test/routines/level3/xsymm.hpp b/test/routines/level3/xsymm.hpp
index 4888091b..5d840d40 100644
--- a/test/routines/level3/xsymm.hpp
+++ b/test/routines/level3/xsymm.hpp
@@ -130,7 +130,7 @@ class TestXsymm {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsymm(args.layout,
+ auto status = cublasXsymm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.side),
convertToCUBLAS(args.triangle),
args.m, args.n, args.alpha,
diff --git a/test/routines/level3/xsyr2k.hpp b/test/routines/level3/xsyr2k.hpp
index 2fc4090c..4a4a2f10 100644
--- a/test/routines/level3/xsyr2k.hpp
+++ b/test/routines/level3/xsyr2k.hpp
@@ -128,7 +128,7 @@ class TestXsyr2k {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsyr2k(args.layout,
+ auto status = cublasXsyr2k(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
args.n, args.k, args.alpha,
diff --git a/test/routines/level3/xsyrk.hpp b/test/routines/level3/xsyrk.hpp
index 34f8f41a..90e46727 100644
--- a/test/routines/level3/xsyrk.hpp
+++ b/test/routines/level3/xsyrk.hpp
@@ -118,7 +118,7 @@ class TestXsyrk {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXsyrk(args.layout,
+ auto status = cublasXsyrk(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
args.n, args.k, args.alpha,
diff --git a/test/routines/level3/xtrmm.hpp b/test/routines/level3/xtrmm.hpp
index abf77db9..acc00e01 100644
--- a/test/routines/level3/xtrmm.hpp
+++ b/test/routines/level3/xtrmm.hpp
@@ -122,7 +122,7 @@ class TestXtrmm {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtrmm(args.layout,
+ auto status = cublasXtrmm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.side),
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
diff --git a/test/routines/level3/xtrsm.hpp b/test/routines/level3/xtrsm.hpp
index 10b216cc..d63c9d79 100644
--- a/test/routines/level3/xtrsm.hpp
+++ b/test/routines/level3/xtrsm.hpp
@@ -133,7 +133,7 @@ class TestXtrsm {
// Describes how to run the cuBLAS routine (for correctness/performance comparison)
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
- auto status = cublasXtrsm(args.layout,
+ auto status = cublasXtrsm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.side),
convertToCUBLAS(args.triangle),
convertToCUBLAS(args.a_transpose),
diff --git a/test/routines/levelx/xaxpybatched.hpp b/test/routines/levelx/xaxpybatched.hpp
index add6c1e1..5385e86e 100644
--- a/test/routines/levelx/xaxpybatched.hpp
+++ b/test/routines/levelx/xaxpybatched.hpp
@@ -129,7 +129,7 @@ class TestXaxpyBatched {
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
for (auto batch = size_t{0}; batch < args.batch_count; ++batch) {
- auto status = cublasXaxpy(args.n, args.alphas[batch],
+ auto status = cublasXaxpy(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.n, args.alphas[batch],
buffers.x_vec, args.x_offsets[batch], args.x_inc,
buffers.y_vec, args.y_offsets[batch], args.y_inc);
if (status != CUBLAS_STATUS_SUCCESS) { return StatusCode::kUnknownError; }
diff --git a/test/routines/levelx/xgemmbatched.hpp b/test/routines/levelx/xgemmbatched.hpp
index ae8630c0..ebfd8b19 100644
--- a/test/routines/levelx/xgemmbatched.hpp
+++ b/test/routines/levelx/xgemmbatched.hpp
@@ -164,7 +164,7 @@ class TestXgemmBatched {
#ifdef CLBLAST_REF_CUBLAS
static StatusCode RunReference3(const Arguments<T> &args, BuffersCUDA<T> &buffers, Queue &) {
for (auto batch = size_t{0}; batch < args.batch_count; ++batch) {
- auto status = cublasXgemm(args.layout,
+ auto status = cublasXgemm(reinterpret_cast<cublasHandle_t>(args.cublas_handle), args.layout,
convertToCUBLAS(args.a_transpose),
convertToCUBLAS(args.b_transpose),
args.m, args.n, args.k, args.alphas[batch],
diff --git a/test/wrapper_cublas.hpp b/test/wrapper_cublas.hpp
index 4de8451a..35b1b9c6 100644
--- a/test/wrapper_cublas.hpp
+++ b/test/wrapper_cublas.hpp
@@ -34,258 +34,226 @@ cublasSideMode_t convertToCUBLAS(const Side v) { return (v == Side::kLeft) ? CUB
// Forwards the cuBLAS calls for SROTG/DROTG
template <typename T>
-cublasStatus_t cublasXrotg(T* sa_buffer, const size_t sa_offset,
+cublasStatus_t cublasXrotg(cublasHandle_t handle, T* sa_buffer, const size_t sa_offset,
T* sb_buffer, const size_t sb_offset,
T* sc_buffer, const size_t sc_offset,
T* ss_buffer, const size_t ss_offset);
template <>
-cublasStatus_t cublasXrotg<float>(float* sa_buffer, const size_t sa_offset,
+cublasStatus_t cublasXrotg<float>(cublasHandle_t handle, float* sa_buffer, const size_t sa_offset,
float* sb_buffer, const size_t sb_offset,
float* sc_buffer, const size_t sc_offset,
float* ss_buffer, const size_t ss_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSrotg(handle, &sa_buffer[sa_offset],
&sb_buffer[sb_offset],
&sc_buffer[sc_offset],
&ss_buffer[ss_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXrotg<double>(double* sa_buffer, const size_t sa_offset,
+cublasStatus_t cublasXrotg<double>(cublasHandle_t handle, double* sa_buffer, const size_t sa_offset,
double* sb_buffer, const size_t sb_offset,
double* sc_buffer, const size_t sc_offset,
double* ss_buffer, const size_t ss_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDrotg(handle, &sa_buffer[sa_offset],
&sb_buffer[sb_offset],
&sc_buffer[sc_offset],
&ss_buffer[ss_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SROTMG/DROTMG
template <typename T>
-cublasStatus_t cublasXrotmg(T* sd1_buffer, const size_t sd1_offset,
+cublasStatus_t cublasXrotmg(cublasHandle_t handle, T* sd1_buffer, const size_t sd1_offset,
T* sd2_buffer, const size_t sd2_offset,
T* sx1_buffer, const size_t sx1_offset,
const T* sy1_buffer, const size_t sy1_offset,
T* sparam_buffer, const size_t sparam_offset);
template <>
-cublasStatus_t cublasXrotmg<float>(float* sd1_buffer, const size_t sd1_offset,
+cublasStatus_t cublasXrotmg<float>(cublasHandle_t handle, float* sd1_buffer, const size_t sd1_offset,
float* sd2_buffer, const size_t sd2_offset,
float* sx1_buffer, const size_t sx1_offset,
const float* sy1_buffer, const size_t sy1_offset,
float* sparam_buffer, const size_t sparam_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSrotmg(handle, &sd1_buffer[sd1_offset],
&sd2_buffer[sd2_offset],
&sx1_buffer[sx1_offset],
&sy1_buffer[sy1_offset],
&sparam_buffer[sparam_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXrotmg<double>(double* sd1_buffer, const size_t sd1_offset,
+cublasStatus_t cublasXrotmg<double>(cublasHandle_t handle, double* sd1_buffer, const size_t sd1_offset,
double* sd2_buffer, const size_t sd2_offset,
double* sx1_buffer, const size_t sx1_offset,
const double* sy1_buffer, const size_t sy1_offset,
double* sparam_buffer, const size_t sparam_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDrotmg(handle, &sd1_buffer[sd1_offset],
&sd2_buffer[sd2_offset],
&sx1_buffer[sx1_offset],
&sy1_buffer[sy1_offset],
&sparam_buffer[sparam_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SROT/DROT
-cublasStatus_t cublasXrot(const size_t n,
+cublasStatus_t cublasXrot(cublasHandle_t handle, const size_t n,
float* x_buffer, const size_t x_offset, const size_t x_inc,
float* y_buffer, const size_t y_offset, const size_t y_inc,
const float cos,
const float sin) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSrot(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&cos,
&sin);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXrot(const size_t n,
+cublasStatus_t cublasXrot(cublasHandle_t handle, const size_t n,
double* x_buffer, const size_t x_offset, const size_t x_inc,
double* y_buffer, const size_t y_offset, const size_t y_inc,
const double cos,
const double sin) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDrot(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&cos,
&sin);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SROTM/DROTM
template <typename T>
-cublasStatus_t cublasXrotm(const size_t n,
+cublasStatus_t cublasXrotm(cublasHandle_t handle, const size_t n,
T* x_buffer, const size_t x_offset, const size_t x_inc,
T* y_buffer, const size_t y_offset, const size_t y_inc,
T* sparam_buffer, const size_t sparam_offset);
template <>
-cublasStatus_t cublasXrotm<float>(const size_t n,
+cublasStatus_t cublasXrotm<float>(cublasHandle_t handle, const size_t n,
float* x_buffer, const size_t x_offset, const size_t x_inc,
float* y_buffer, const size_t y_offset, const size_t y_inc,
float* sparam_buffer, const size_t sparam_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSrotm(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&sparam_buffer[sparam_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXrotm<double>(const size_t n,
+cublasStatus_t cublasXrotm<double>(cublasHandle_t handle, const size_t n,
double* x_buffer, const size_t x_offset, const size_t x_inc,
double* y_buffer, const size_t y_offset, const size_t y_inc,
double* sparam_buffer, const size_t sparam_offset) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDrotm(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&sparam_buffer[sparam_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SSWAP/DSWAP/CSWAP/ZSWAP
template <typename T>
-cublasStatus_t cublasXswap(const size_t n,
+cublasStatus_t cublasXswap(cublasHandle_t handle, const size_t n,
T* x_buffer, const size_t x_offset, const size_t x_inc,
T* y_buffer, const size_t y_offset, const size_t y_inc);
template <>
-cublasStatus_t cublasXswap<float>(const size_t n,
+cublasStatus_t cublasXswap<float>(cublasHandle_t handle, const size_t n,
float* x_buffer, const size_t x_offset, const size_t x_inc,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSswap(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXswap<double>(const size_t n,
+cublasStatus_t cublasXswap<double>(cublasHandle_t handle, const size_t n,
double* x_buffer, const size_t x_offset, const size_t x_inc,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDswap(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXswap<float2>(const size_t n,
+cublasStatus_t cublasXswap<float2>(cublasHandle_t handle, const size_t n,
float2* x_buffer, const size_t x_offset, const size_t x_inc,
float2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCswap(handle, static_cast<int>(n),
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXswap<double2>(const size_t n,
+cublasStatus_t cublasXswap<double2>(cublasHandle_t handle, const size_t n,
double2* x_buffer, const size_t x_offset, const size_t x_inc,
double2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZswap(handle, static_cast<int>(n),
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXswap<half>(const size_t n,
+cublasStatus_t cublasXswap<half>(cublasHandle_t handle, const size_t n,
half* x_buffer, const size_t x_offset, const size_t x_inc,
half* y_buffer, const size_t y_offset, const size_t y_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
}
// Forwards the cuBLAS calls for SSCAL/DSCAL/CSCAL/ZSCAL
-cublasStatus_t cublasXscal(const size_t n,
+cublasStatus_t cublasXscal(cublasHandle_t handle, const size_t n,
const float alpha,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSscal(handle, static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXscal(const size_t n,
+cublasStatus_t cublasXscal(cublasHandle_t handle, const size_t n,
const double alpha,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDscal(handle, static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXscal(const size_t n,
+cublasStatus_t cublasXscal(cublasHandle_t handle, const size_t n,
const float2 alpha,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCscal(handle, static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXscal(const size_t n,
+cublasStatus_t cublasXscal(cublasHandle_t handle, const size_t n,
const double2 alpha,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZscal(handle, static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXscal(const size_t n,
+cublasStatus_t cublasXscal(cublasHandle_t handle, const size_t n,
const half alpha,
half* x_buffer, const size_t x_offset, const size_t x_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
@@ -293,124 +261,108 @@ cublasStatus_t cublasXscal(const size_t n,
// Forwards the cuBLAS calls for SCOPY/DCOPY/CCOPY/ZCOPY
template <typename T>
-cublasStatus_t cublasXcopy(const size_t n,
+cublasStatus_t cublasXcopy(cublasHandle_t handle, const size_t n,
const T* x_buffer, const size_t x_offset, const size_t x_inc,
T* y_buffer, const size_t y_offset, const size_t y_inc);
template <>
-cublasStatus_t cublasXcopy<float>(const size_t n,
+cublasStatus_t cublasXcopy<float>(cublasHandle_t handle, const size_t n,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasScopy(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXcopy<double>(const size_t n,
+cublasStatus_t cublasXcopy<double>(cublasHandle_t handle, const size_t n,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDcopy(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXcopy<float2>(const size_t n,
+cublasStatus_t cublasXcopy<float2>(cublasHandle_t handle, const size_t n,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
float2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCcopy(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXcopy<double2>(const size_t n,
+cublasStatus_t cublasXcopy<double2>(cublasHandle_t handle, const size_t n,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
double2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZcopy(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXcopy<half>(const size_t n,
+cublasStatus_t cublasXcopy<half>(cublasHandle_t handle, const size_t n,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
half* y_buffer, const size_t y_offset, const size_t y_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
}
// Forwards the cuBLAS calls for SAXPY/DAXPY/CAXPY/ZAXPY
-cublasStatus_t cublasXaxpy(const size_t n,
+cublasStatus_t cublasXaxpy(cublasHandle_t handle, const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSaxpy(handle, static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXaxpy(const size_t n,
+cublasStatus_t cublasXaxpy(cublasHandle_t handle, const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDaxpy(handle, static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXaxpy(const size_t n,
+cublasStatus_t cublasXaxpy(cublasHandle_t handle, const size_t n,
const float2 alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
float2* y_buffer, const size_t y_offset, const size_t y_inc) {
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCaxpy(handle, static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXaxpy(const size_t n,
+cublasStatus_t cublasXaxpy(cublasHandle_t handle, const size_t n,
const double2 alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
double2* y_buffer, const size_t y_offset, const size_t y_inc) {
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZaxpy(handle, static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXaxpy(const size_t n,
+cublasStatus_t cublasXaxpy(cublasHandle_t handle, const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
half* y_buffer, const size_t y_offset, const size_t y_inc) {
@@ -419,40 +371,36 @@ cublasStatus_t cublasXaxpy(const size_t n,
// Forwards the cuBLAS calls for SDOT/DDOT
template <typename T>
-cublasStatus_t cublasXdot(const size_t n,
+cublasStatus_t cublasXdot(cublasHandle_t handle, const size_t n,
T* dot_buffer, const size_t dot_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc,
const T* y_buffer, const size_t y_offset, const size_t y_inc);
template <>
-cublasStatus_t cublasXdot<float>(const size_t n,
+cublasStatus_t cublasXdot<float>(cublasHandle_t handle, const size_t n,
float* dot_buffer, const size_t dot_offset,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
const float* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSdot(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&dot_buffer[dot_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXdot<double>(const size_t n,
+cublasStatus_t cublasXdot<double>(cublasHandle_t handle, const size_t n,
double* dot_buffer, const size_t dot_offset,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
const double* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDdot(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&dot_buffer[dot_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXdot<half>(const size_t n,
+cublasStatus_t cublasXdot<half>(cublasHandle_t handle, const size_t n,
half* dot_buffer, const size_t dot_offset,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
const half* y_buffer, const size_t y_offset, const size_t y_inc) {
@@ -461,129 +409,113 @@ cublasStatus_t cublasXdot<half>(const size_t n,
// Forwards the cuBLAS calls for CDOTU/ZDOTU
template <typename T>
-cublasStatus_t cublasXdotu(const size_t n,
+cublasStatus_t cublasXdotu(cublasHandle_t handle, const size_t n,
T* dot_buffer, const size_t dot_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc,
const T* y_buffer, const size_t y_offset, const size_t y_inc);
template <>
-cublasStatus_t cublasXdotu<float2>(const size_t n,
+cublasStatus_t cublasXdotu<float2>(cublasHandle_t handle, const size_t n,
float2* dot_buffer, const size_t dot_offset,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
const float2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCdotu(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&dot_buffer[dot_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXdotu<double2>(const size_t n,
+cublasStatus_t cublasXdotu<double2>(cublasHandle_t handle, const size_t n,
double2* dot_buffer, const size_t dot_offset,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
const double2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZdotu(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&dot_buffer[dot_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CDOTC/ZDOTC
template <typename T>
-cublasStatus_t cublasXdotc(const size_t n,
+cublasStatus_t cublasXdotc(cublasHandle_t handle, const size_t n,
T* dot_buffer, const size_t dot_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc,
const T* y_buffer, const size_t y_offset, const size_t y_inc);
template <>
-cublasStatus_t cublasXdotc<float2>(const size_t n,
+cublasStatus_t cublasXdotc<float2>(cublasHandle_t handle, const size_t n,
float2* dot_buffer, const size_t dot_offset,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
const float2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCdotc(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&dot_buffer[dot_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXdotc<double2>(const size_t n,
+cublasStatus_t cublasXdotc<double2>(cublasHandle_t handle, const size_t n,
double2* dot_buffer, const size_t dot_offset,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
const double2* y_buffer, const size_t y_offset, const size_t y_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZdotc(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&dot_buffer[dot_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SNRM2/DNRM2/ScNRM2/DzNRM2
template <typename T>
-cublasStatus_t cublasXnrm2(const size_t n,
+cublasStatus_t cublasXnrm2(cublasHandle_t handle, const size_t n,
T* nrm2_buffer, const size_t nrm2_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXnrm2<float>(const size_t n,
+cublasStatus_t cublasXnrm2<float>(cublasHandle_t handle, const size_t n,
float* nrm2_buffer, const size_t nrm2_offset,
const float* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSnrm2(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&nrm2_buffer[nrm2_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXnrm2<double>(const size_t n,
+cublasStatus_t cublasXnrm2<double>(cublasHandle_t handle, const size_t n,
double* nrm2_buffer, const size_t nrm2_offset,
const double* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDnrm2(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&nrm2_buffer[nrm2_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXnrm2<float2>(const size_t n,
+cublasStatus_t cublasXnrm2<float2>(cublasHandle_t handle, const size_t n,
float2* nrm2_buffer, const size_t nrm2_offset,
const float2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasScnrm2(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<float*>(&nrm2_buffer[nrm2_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXnrm2<double2>(const size_t n,
+cublasStatus_t cublasXnrm2<double2>(cublasHandle_t handle, const size_t n,
double2* nrm2_buffer, const size_t nrm2_offset,
const double2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDznrm2(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<double*>(&nrm2_buffer[nrm2_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXnrm2<half>(const size_t n,
+cublasStatus_t cublasXnrm2<half>(cublasHandle_t handle, const size_t n,
half* nrm2_buffer, const size_t nrm2_offset,
const half* x_buffer, const size_t x_offset, const size_t x_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
@@ -591,59 +523,51 @@ cublasStatus_t cublasXnrm2<half>(const size_t n,
// Forwards the cuBLAS calls for SASUM/DASUM/ScASUM/DzASUM
template <typename T>
-cublasStatus_t cublasXasum(const size_t n,
+cublasStatus_t cublasXasum(cublasHandle_t handle, const size_t n,
T* asum_buffer, const size_t asum_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXasum<float>(const size_t n,
+cublasStatus_t cublasXasum<float>(cublasHandle_t handle, const size_t n,
float* asum_buffer, const size_t asum_offset,
const float* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSasum(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&asum_buffer[asum_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXasum<double>(const size_t n,
+cublasStatus_t cublasXasum<double>(cublasHandle_t handle, const size_t n,
double* asum_buffer, const size_t asum_offset,
const double* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDasum(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
&asum_buffer[asum_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXasum<float2>(const size_t n,
+cublasStatus_t cublasXasum<float2>(cublasHandle_t handle, const size_t n,
float2* asum_buffer, const size_t asum_offset,
const float2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasScasum(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<float*>(&asum_buffer[asum_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXasum<double2>(const size_t n,
+cublasStatus_t cublasXasum<double2>(cublasHandle_t handle, const size_t n,
double2* asum_buffer, const size_t asum_offset,
const double2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDzasum(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<double*>(&asum_buffer[asum_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXasum<half>(const size_t n,
+cublasStatus_t cublasXasum<half>(cublasHandle_t handle, const size_t n,
half* asum_buffer, const size_t asum_offset,
const half* x_buffer, const size_t x_offset, const size_t x_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
@@ -651,59 +575,51 @@ cublasStatus_t cublasXasum<half>(const size_t n,
// Forwards the cuBLAS calls for iSAMAX/iDAMAX/iCAMAX/iZAMAX/iHAMAX
template <typename T>
-cublasStatus_t cublasXamax(const size_t n,
+cublasStatus_t cublasXamax(cublasHandle_t handle, const size_t n,
T* imax_buffer, const size_t imax_offset,
const T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXamax<float>(const size_t n,
+cublasStatus_t cublasXamax<float>(cublasHandle_t handle, const size_t n,
float* imax_buffer, const size_t imax_offset,
const float* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasIsamax(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
reinterpret_cast<int*>(&imax_buffer[imax_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXamax<double>(const size_t n,
+cublasStatus_t cublasXamax<double>(cublasHandle_t handle, const size_t n,
double* imax_buffer, const size_t imax_offset,
const double* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasIdamax(handle, static_cast<int>(n),
&x_buffer[x_offset], static_cast<int>(x_inc),
reinterpret_cast<int*>(&imax_buffer[imax_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXamax<float2>(const size_t n,
+cublasStatus_t cublasXamax<float2>(cublasHandle_t handle, const size_t n,
float2* imax_buffer, const size_t imax_offset,
const float2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasIcamax(handle, static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<int*>(&imax_buffer[imax_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXamax<double2>(const size_t n,
+cublasStatus_t cublasXamax<double2>(cublasHandle_t handle, const size_t n,
double2* imax_buffer, const size_t imax_offset,
const double2* x_buffer, const size_t x_offset, const size_t x_inc) {
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasIzamax(handle, static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<int*>(&imax_buffer[imax_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXamax<half>(const size_t n,
+cublasStatus_t cublasXamax<half>(cublasHandle_t handle, const size_t n,
half* imax_buffer, const size_t imax_offset,
const half* x_buffer, const size_t x_offset, const size_t x_inc) {
return CUBLAS_STATUS_NOT_SUPPORTED;
@@ -714,7 +630,7 @@ cublasStatus_t cublasXamax<half>(const size_t n,
// =================================================================================================
// Forwards the cuBLAS calls for SGEMV/DGEMV/CGEMV/ZGEMV
-cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgemv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -722,8 +638,6 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
const float beta,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSgemv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n),
&alpha,
@@ -731,10 +645,10 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgemv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -742,8 +656,6 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
const double beta,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDgemv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n),
&alpha,
@@ -751,10 +663,10 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgemv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -768,8 +680,6 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCgemv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -777,10 +687,10 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgemv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -794,8 +704,6 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZgemv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -803,10 +711,10 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgemv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -817,7 +725,7 @@ cublasStatus_t cublasXgemv(const Layout layout, const cublasOperation_t a_transp
}
// Forwards the cuBLAS calls for SGBMV/DGBMV/CGBMV/ZGBMV
-cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgbmv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n, const size_t kl, const size_t ku,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -825,8 +733,6 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
const float beta,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSgbmv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(kl), static_cast<int>(ku),
&alpha,
@@ -834,10 +740,10 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgbmv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n, const size_t kl, const size_t ku,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -845,8 +751,6 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
const double beta,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDgbmv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(kl), static_cast<int>(ku),
&alpha,
@@ -854,10 +758,10 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgbmv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n, const size_t kl, const size_t ku,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -871,8 +775,6 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCgbmv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(kl), static_cast<int>(ku),
&alpha_cuda,
@@ -880,10 +782,10 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgbmv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n, const size_t kl, const size_t ku,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -897,8 +799,6 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZgbmv(handle, a_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(kl), static_cast<int>(ku),
&alpha_cuda,
@@ -906,10 +806,10 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXgbmv(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose,
const size_t m, const size_t n, const size_t kl, const size_t ku,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -920,7 +820,7 @@ cublasStatus_t cublasXgbmv(const Layout layout, const cublasOperation_t a_transp
}
// Forwards the cuBLAS calls for CHEMV/ZHEMV
-cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhemv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -934,8 +834,6 @@ cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChemv(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
@@ -943,10 +841,10 @@ cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhemv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -960,8 +858,6 @@ cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhemv(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
@@ -969,12 +865,12 @@ cublasStatus_t cublasXhemv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHBMV/ZHBMV
-cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n, const size_t k,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -988,8 +884,6 @@ cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChbmv(handle, triangle,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -997,10 +891,10 @@ cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n, const size_t k,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1014,8 +908,6 @@ cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhbmv(handle, triangle,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -1023,12 +915,12 @@ cublasStatus_t cublasXhbmv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHPMV/ZHPMV
-cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float2 alpha,
const float2* ap_buffer, const size_t ap_offset,
@@ -1042,8 +934,6 @@ cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChpmv(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
@@ -1051,10 +941,10 @@ cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double2 alpha,
const double2* ap_buffer, const size_t ap_offset,
@@ -1068,8 +958,6 @@ cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhpmv(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
@@ -1077,12 +965,12 @@ cublasStatus_t cublasXhpmv(const Layout layout, const cublasFillMode_t triangle,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SSYMV/DSYMV
-cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1090,8 +978,6 @@ cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
const float beta,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsymv(handle, triangle,
static_cast<int>(n),
&alpha,
@@ -1099,10 +985,10 @@ cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1110,8 +996,6 @@ cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
const double beta,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsymv(handle, triangle,
static_cast<int>(n),
&alpha,
@@ -1119,10 +1003,10 @@ cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1133,7 +1017,7 @@ cublasStatus_t cublasXsymv(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for SSBMV/DSBMV
-cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n, const size_t k,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1141,8 +1025,6 @@ cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
const float beta,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsbmv(handle, triangle,
static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -1150,10 +1032,10 @@ cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n, const size_t k,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1161,8 +1043,6 @@ cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
const double beta,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsbmv(handle, triangle,
static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -1170,10 +1050,10 @@ cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n, const size_t k,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -1184,7 +1064,7 @@ cublasStatus_t cublasXsbmv(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for SSPMV/DSPMV
-cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* ap_buffer, const size_t ap_offset,
@@ -1192,8 +1072,6 @@ cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
const float beta,
float* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSspmv(handle, triangle,
static_cast<int>(n),
&alpha,
@@ -1201,10 +1079,10 @@ cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* ap_buffer, const size_t ap_offset,
@@ -1212,8 +1090,6 @@ cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
const double beta,
double* y_buffer, const size_t y_offset, const size_t y_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDspmv(handle, triangle,
static_cast<int>(n),
&alpha,
@@ -1221,10 +1097,10 @@ cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
&x_buffer[x_offset], static_cast<int>(x_inc),
&beta,
&y_buffer[y_offset], static_cast<int>(y_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* ap_buffer, const size_t ap_offset,
@@ -1236,72 +1112,64 @@ cublasStatus_t cublasXspmv(const Layout layout, const cublasFillMode_t triangle,
// Forwards the cuBLAS calls for STRMV/DTRMV/CTRMV/ZTRMV
template <typename T>
-cublasStatus_t cublasXtrmv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const T* a_buffer, const size_t a_offset, const size_t a_ld,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtrmv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStrmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrmv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtrmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrmv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtrmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrmv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtrmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrmv<half>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmv<half>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
half* x_buffer, const size_t x_offset, const size_t x_inc) {
@@ -1310,72 +1178,64 @@ cublasStatus_t cublasXtrmv<half>(const Layout layout, const cublasFillMode_t tri
// Forwards the cuBLAS calls for STBMV/DTBMV/CTBMV/ZTBMV
template <typename T>
-cublasStatus_t cublasXtbmv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const T* a_buffer, const size_t a_offset, const size_t a_ld,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtbmv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStbmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbmv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtbmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbmv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtbmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbmv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtbmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbmv<half>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbmv<half>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
half* x_buffer, const size_t x_offset, const size_t x_inc) {
@@ -1384,72 +1244,64 @@ cublasStatus_t cublasXtbmv<half>(const Layout layout, const cublasFillMode_t tri
// Forwards the cuBLAS calls for STPMV/DTPMV/CTPMV/ZTPMV
template <typename T>
-cublasStatus_t cublasXtpmv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const T* ap_buffer, const size_t ap_offset,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtpmv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float* ap_buffer, const size_t ap_offset,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStpmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&ap_buffer[ap_offset],
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpmv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double* ap_buffer, const size_t ap_offset,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtpmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&ap_buffer[ap_offset],
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpmv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float2* ap_buffer, const size_t ap_offset,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtpmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&ap_buffer[ap_offset]),
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpmv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double2* ap_buffer, const size_t ap_offset,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtpmv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&ap_buffer[ap_offset]),
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpmv<half>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpmv<half>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const half* ap_buffer, const size_t ap_offset,
half* x_buffer, const size_t x_offset, const size_t x_inc) {
@@ -1458,241 +1310,213 @@ cublasStatus_t cublasXtpmv<half>(const Layout layout, const cublasFillMode_t tri
// Forwards the cuBLAS calls for STRSV/DTRSV/CTRSV/ZTRSV
template <typename T>
-cublasStatus_t cublasXtrsv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const T* a_buffer, const size_t a_offset, const size_t a_ld,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtrsv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStrsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrsv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtrsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrsv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtrsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtrsv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtrsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for STBSV/DTBSV/CTBSV/ZTBSV
template <typename T>
-cublasStatus_t cublasXtbsv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbsv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const T* a_buffer, const size_t a_offset, const size_t a_ld,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtbsv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbsv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStbsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbsv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbsv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtbsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
&a_buffer[a_offset], a_ld,
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbsv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbsv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtbsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtbsv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtbsv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n, const size_t k,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtbsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n), static_cast<int>(k),
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for STPSV/DTPSV/CTPSV/ZTPSV
template <typename T>
-cublasStatus_t cublasXtpsv(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpsv(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const T* ap_buffer, const size_t ap_offset,
T* x_buffer, const size_t x_offset, const size_t x_inc);
template <>
-cublasStatus_t cublasXtpsv<float>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpsv<float>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float* ap_buffer, const size_t ap_offset,
float* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStpsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&ap_buffer[ap_offset],
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpsv<double>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpsv<double>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double* ap_buffer, const size_t ap_offset,
double* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtpsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
&ap_buffer[ap_offset],
&x_buffer[x_offset], static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpsv<float2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpsv<float2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const float2* ap_buffer, const size_t ap_offset,
float2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtpsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuComplex*>(&ap_buffer[ap_offset]),
reinterpret_cast<cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
template <>
-cublasStatus_t cublasXtpsv<double2>(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtpsv<double2>(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t n,
const double2* ap_buffer, const size_t ap_offset,
double2* x_buffer, const size_t x_offset, const size_t x_inc) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtpsv(handle, triangle, a_transpose, diagonal,
static_cast<int>(n),
reinterpret_cast<const cuDoubleComplex*>(&ap_buffer[ap_offset]),
reinterpret_cast<cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SGER/DGER
-cublasStatus_t cublasXger(const Layout layout,
+cublasStatus_t cublasXger(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
const float* y_buffer, const size_t y_offset, const size_t y_inc,
float* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSger(handle, static_cast<int>(m), static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXger(const Layout layout,
+cublasStatus_t cublasXger(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
const double* y_buffer, const size_t y_offset, const size_t y_inc,
double* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDger(handle, static_cast<int>(m), static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXger(const Layout layout,
+cublasStatus_t cublasXger(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1702,7 +1526,7 @@ cublasStatus_t cublasXger(const Layout layout,
}
// Forwards the cuBLAS calls for CGERU/ZGERU
-cublasStatus_t cublasXgeru(const Layout layout,
+cublasStatus_t cublasXgeru(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const float2 alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1712,17 +1536,15 @@ cublasStatus_t cublasXgeru(const Layout layout,
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCgeru(handle, static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgeru(const Layout layout,
+cublasStatus_t cublasXgeru(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const double2 alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1732,19 +1554,17 @@ cublasStatus_t cublasXgeru(const Layout layout,
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZgeru(handle, static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CGERC/ZGERC
-cublasStatus_t cublasXgerc(const Layout layout,
+cublasStatus_t cublasXgerc(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const float2 alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1754,17 +1574,15 @@ cublasStatus_t cublasXgerc(const Layout layout,
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCgerc(handle, static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgerc(const Layout layout,
+cublasStatus_t cublasXgerc(cublasHandle_t handle, const Layout layout,
const size_t m, const size_t n,
const double2 alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1774,87 +1592,77 @@ cublasStatus_t cublasXgerc(const Layout layout,
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZgerc(handle, static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHER/ZHER
-cublasStatus_t cublasXher(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXher(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
float2* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCher(handle, triangle,
static_cast<int>(n),
&alpha,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXher(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXher(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
double2* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZher(handle, triangle,
static_cast<int>(n),
&alpha,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuDoubleComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHPR/ZHPR
-cublasStatus_t cublasXhpr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
float2* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChpr(handle, triangle,
static_cast<int>(n),
&alpha,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuComplex*>(&ap_buffer[ap_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhpr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
double2* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhpr(handle, triangle,
static_cast<int>(n),
&alpha,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<cuDoubleComplex*>(&ap_buffer[ap_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHER2/ZHER2
-cublasStatus_t cublasXher2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXher2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float2 alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1864,18 +1672,16 @@ cublasStatus_t cublasXher2(const Layout layout, const cublasFillMode_t triangle,
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCher2(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXher2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXher2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double2 alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1885,20 +1691,18 @@ cublasStatus_t cublasXher2(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZher2(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&a_buffer[a_offset]), a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for CHPR2/ZHPR2
-cublasStatus_t cublasXhpr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float2 alpha,
const float2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1908,18 +1712,16 @@ cublasStatus_t cublasXhpr2(const Layout layout, const cublasFillMode_t triangle,
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChpr2(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuComplex*>(&ap_buffer[ap_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhpr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhpr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double2 alpha,
const double2* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1929,52 +1731,46 @@ cublasStatus_t cublasXhpr2(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhpr2(handle, triangle,
static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&x_buffer[x_offset]), static_cast<int>(x_inc),
reinterpret_cast<const cuDoubleComplex*>(&y_buffer[y_offset]), static_cast<int>(y_inc),
reinterpret_cast<cuDoubleComplex*>(&ap_buffer[ap_offset]));
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SSYR/DSYR
-cublasStatus_t cublasXsyr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
float* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsyr(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
double* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsyr(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -1983,39 +1779,35 @@ cublasStatus_t cublasXsyr(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for SSPR/DSPR
-cublasStatus_t cublasXspr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
float* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSspr(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&ap_buffer[ap_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
double* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDspr(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&ap_buffer[ap_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspr(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -2024,43 +1816,39 @@ cublasStatus_t cublasXspr(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for SSYR2/DSYR2
-cublasStatus_t cublasXsyr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
const float* y_buffer, const size_t y_offset, const size_t y_inc,
float* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsyr2(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
const double* y_buffer, const size_t y_offset, const size_t y_inc,
double* a_buffer, const size_t a_offset, const size_t a_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsyr2(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&a_buffer[a_offset], a_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsyr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -2070,43 +1858,39 @@ cublasStatus_t cublasXsyr2(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for SSPR2/DSPR2
-cublasStatus_t cublasXspr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const float alpha,
const float* x_buffer, const size_t x_offset, const size_t x_inc,
const float* y_buffer, const size_t y_offset, const size_t y_inc,
float* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSspr2(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&ap_buffer[ap_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const double alpha,
const double* x_buffer, const size_t x_offset, const size_t x_inc,
const double* y_buffer, const size_t y_offset, const size_t y_inc,
double* ap_buffer, const size_t ap_offset) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDspr2(handle, triangle,
static_cast<int>(n),
&alpha,
&x_buffer[x_offset], static_cast<int>(x_inc),
&y_buffer[y_offset], static_cast<int>(y_inc),
&ap_buffer[ap_offset]);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXspr2(const Layout layout, const cublasFillMode_t triangle,
+cublasStatus_t cublasXspr2(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle,
const size_t n,
const half alpha,
const half* x_buffer, const size_t x_offset, const size_t x_inc,
@@ -2120,7 +1904,7 @@ cublasStatus_t cublasXspr2(const Layout layout, const cublasFillMode_t triangle,
// =================================================================================================
// Forwards the cuBLAS calls for SGEMM/DGEMM/CGEMM/ZGEMM
-cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
+cublasStatus_t cublasXgemm(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
const size_t m, const size_t n, const size_t k,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2128,8 +1912,6 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
const float beta,
float* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSgemm(handle, a_transpose, b_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -2137,10 +1919,10 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
+cublasStatus_t cublasXgemm(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
const size_t m, const size_t n, const size_t k,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2148,8 +1930,6 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
const double beta,
double* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDgemm(handle, a_transpose, b_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -2157,10 +1937,10 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
+cublasStatus_t cublasXgemm(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
const size_t m, const size_t n, const size_t k,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2174,8 +1954,6 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCgemm(handle, a_transpose, b_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2183,10 +1961,10 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
+cublasStatus_t cublasXgemm(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
const size_t m, const size_t n, const size_t k,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2200,8 +1978,6 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZgemm(handle, a_transpose, b_transpose,
static_cast<int>(m), static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2209,10 +1985,10 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
reinterpret_cast<const cuDoubleComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
+cublasStatus_t cublasXgemm(cublasHandle_t handle, const Layout layout, const cublasOperation_t a_transpose, const cublasOperation_t b_transpose,
const size_t m, const size_t n, const size_t k,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2223,7 +1999,7 @@ cublasStatus_t cublasXgemm(const Layout layout, const cublasOperation_t a_transp
}
// Forwards the cuBLAS calls for SSYMM/DSYMM/CSYMM/ZSYMM
-cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2231,8 +2007,6 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
const float beta,
float* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsymm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha,
@@ -2240,10 +2014,10 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2251,8 +2025,6 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
const double beta,
double* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsymm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha,
@@ -2260,10 +2032,10 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2277,8 +2049,6 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCsymm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -2286,10 +2056,10 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
reinterpret_cast<const cuComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2303,8 +2073,6 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZsymm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -2312,10 +2080,10 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
reinterpret_cast<const cuDoubleComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXsymm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2326,7 +2094,7 @@ cublasStatus_t cublasXsymm(const Layout layout, const cublasSideMode_t side, con
}
// Forwards the cuBLAS calls for CHEMM/ZHEMM
-cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhemm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2340,8 +2108,6 @@ cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, con
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasChemm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -2349,10 +2115,10 @@ cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, con
reinterpret_cast<const cuComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
+cublasStatus_t cublasXhemm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle,
const size_t m, const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2366,8 +2132,6 @@ cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, con
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZhemm(handle, side, triangle,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
@@ -2375,48 +2139,44 @@ cublasStatus_t cublasXhemm(const Layout layout, const cublasSideMode_t side, con
reinterpret_cast<const cuDoubleComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SSYRK/DSYRK/CSYRK/ZSYRK
-cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXsyrk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
const float beta,
float* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsyrk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
&a_buffer[a_offset], a_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXsyrk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
const double beta,
double* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsyrk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
&a_buffer[a_offset], a_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXsyrk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2429,18 +2189,16 @@ cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle,
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCsyrk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
&beta_cuda,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXsyrk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2453,18 +2211,16 @@ cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle,
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZsyrk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXsyrk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2474,45 +2230,41 @@ cublasStatus_t cublasXsyrk(const Layout layout, const cublasFillMode_t triangle,
}
// Forwards the cuBLAS calls for CHERK/ZHERK
-cublasStatus_t cublasXherk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXherk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const float alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
const float beta,
float2* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCherk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
&beta,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXherk(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
+cublasStatus_t cublasXherk(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t a_transpose,
const size_t n, const size_t k,
const double alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
const double beta,
double2* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZherk(handle, triangle, a_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
&beta,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for SSYR2K/DSYR2K/CSYR2K/ZSYR2K
-cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXsyr2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2520,8 +2272,6 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
const float beta,
float* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasSsyr2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -2529,10 +2279,10 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXsyr2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2540,8 +2290,6 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
const double beta,
double* c_buffer, const size_t c_offset, const size_t c_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDsyr2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha,
@@ -2549,10 +2297,10 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
&b_buffer[b_offset], b_ld,
&beta,
&c_buffer[c_offset], c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXsyr2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2566,8 +2314,6 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
cuComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCsyr2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2575,10 +2321,10 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
reinterpret_cast<const cuComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXsyr2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2592,8 +2338,6 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
cuDoubleComplex beta_cuda;
beta_cuda.x = beta.real();
beta_cuda.y = beta.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZsyr2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2601,10 +2345,10 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
reinterpret_cast<const cuDoubleComplex*>(&b_buffer[b_offset]), b_ld,
&beta_cuda,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXsyr2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2615,7 +2359,7 @@ cublasStatus_t cublasXsyr2k(const Layout layout, const cublasFillMode_t triangle
}
// Forwards the cuBLAS calls for CHER2K/ZHER2K
-cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXher2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2626,8 +2370,6 @@ cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCher2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2635,10 +2377,10 @@ cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle
reinterpret_cast<const cuComplex*>(&b_buffer[b_offset]), b_ld,
&beta,
reinterpret_cast<cuComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
+cublasStatus_t cublasXher2k(cublasHandle_t handle, const Layout layout, const cublasFillMode_t triangle, const cublasOperation_t ab_transpose,
const size_t n, const size_t k,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2649,8 +2391,6 @@ cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZher2k(handle, triangle, ab_transpose,
static_cast<int>(n), static_cast<int>(k),
&alpha_cuda,
@@ -2658,46 +2398,42 @@ cublasStatus_t cublasXher2k(const Layout layout, const cublasFillMode_t triangle
reinterpret_cast<const cuDoubleComplex*>(&b_buffer[b_offset]), b_ld,
&beta,
reinterpret_cast<cuDoubleComplex*>(&c_buffer[c_offset]), c_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
// Forwards the cuBLAS calls for STRMM/DTRMM/CTRMM/ZTRMM
-cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* b_buffer, const size_t b_offset, const size_t b_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStrmm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha,
&a_buffer[a_offset], a_ld,
&a_buffer[a_offset], a_ld,
&b_buffer[b_offset], b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* b_buffer, const size_t b_offset, const size_t b_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtrmm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha,
&a_buffer[a_offset], a_ld,
&a_buffer[a_offset], a_ld,
&b_buffer[b_offset], b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2706,18 +2442,16 @@ cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, con
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtrmm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&b_buffer[b_offset]), b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2726,18 +2460,16 @@ cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, con
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtrmm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&b_buffer[b_offset]), b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrmm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const half alpha,
const half* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2746,39 +2478,35 @@ cublasStatus_t cublasXtrmm(const Layout layout, const cublasSideMode_t side, con
}
// Forwards the cuBLAS calls for STRSM/DTRSM/CTRSM/ZTRSM
-cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const float alpha,
const float* a_buffer, const size_t a_offset, const size_t a_ld,
float* b_buffer, const size_t b_offset, const size_t b_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasStrsm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha,
&a_buffer[a_offset], a_ld,
&b_buffer[b_offset], b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const double alpha,
const double* a_buffer, const size_t a_offset, const size_t a_ld,
double* b_buffer, const size_t b_offset, const size_t b_ld) {
if (layout == Layout::kRowMajor) { return CUBLAS_STATUS_NOT_SUPPORTED; }
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasDtrsm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha,
&a_buffer[a_offset], a_ld,
&b_buffer[b_offset], b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const float2 alpha,
const float2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2787,17 +2515,15 @@ cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, con
cuComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasCtrsm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuComplex*>(&b_buffer[b_offset]), b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
-cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
+cublasStatus_t cublasXtrsm(cublasHandle_t handle, const Layout layout, const cublasSideMode_t side, const cublasFillMode_t triangle, const cublasOperation_t a_transpose, const cublasDiagType_t diagonal,
const size_t m, const size_t n,
const double2 alpha,
const double2* a_buffer, const size_t a_offset, const size_t a_ld,
@@ -2806,14 +2532,12 @@ cublasStatus_t cublasXtrsm(const Layout layout, const cublasSideMode_t side, con
cuDoubleComplex alpha_cuda;
alpha_cuda.x = alpha.real();
alpha_cuda.y = alpha.imag();
- cublasHandle_t handle;
- if (cublasCreate(&handle) != CUBLAS_STATUS_SUCCESS) { return CUBLAS_STATUS_NOT_INITIALIZED; }
auto status = cublasZtrsm(handle, side, triangle, a_transpose, diagonal,
static_cast<int>(m), static_cast<int>(n),
&alpha_cuda,
reinterpret_cast<const cuDoubleComplex*>(&a_buffer[a_offset]), a_ld,
reinterpret_cast<cuDoubleComplex*>(&b_buffer[b_offset]), b_ld);
- cublasDestroy(handle);
+ cudaDeviceSynchronize();
return status;
}
diff --git a/test/wrapper_cuda.hpp b/test/wrapper_cuda.hpp
index 509de9d1..51f897c4 100644
--- a/test/wrapper_cuda.hpp
+++ b/test/wrapper_cuda.hpp
@@ -29,17 +29,47 @@
namespace clblast {
// =================================================================================================
+#ifdef CLBLAST_REF_CUBLAS
+ template <typename T>
+ void cublasSetup(Arguments<T> &args) {
+ cudaSetDevice(static_cast<int>(args.device_id));
+ auto status = cublasCreate(reinterpret_cast<cublasHandle_t*>(&args.cublas_handle));
+ if (status != CUBLAS_STATUS_SUCCESS) {
+ throw std::runtime_error("CUDA cublasCreate error");
+ }
+ }
+#endif
+
+#ifdef CLBLAST_REF_CUBLAS
+ template <typename T>
+ void cublasTeardown(Arguments<T> &args) {
+ auto status = cublasDestroy(reinterpret_cast<cublasHandle_t>(args.cublas_handle));
+ if (status != CUBLAS_STATUS_SUCCESS) {
+ throw std::runtime_error("CUDA cublasDestroy error");
+ }
+ }
+#endif
+
+// =================================================================================================
+
// Copies data from the CUDA device to the host and frees-up the CUDA memory afterwards
#ifdef CLBLAST_REF_CUBLAS
template <typename T>
- void CUDAToHost(T* buffer_cuda, std::vector<T> &buffer_host, const size_t size) {
- cudaMemcpy(
+ void CUDAToHost(T** buffer_cuda, std::vector<T> &buffer_host, const size_t size) {
+ auto status1 = cudaMemcpy(
reinterpret_cast<void*>(buffer_host.data()),
- reinterpret_cast<void*>(buffer_cuda),
+ reinterpret_cast<void*>(*buffer_cuda),
size*sizeof(T),
cudaMemcpyDeviceToHost
);
- cudaFree(buffer_cuda);
+ if (status1 != cudaSuccess) {
+ throw std::runtime_error("CUDA cudaMemcpy error with status: "+ToString(static_cast<int>(status1)));
+ }
+ auto status2 = cudaFree(*buffer_cuda);
+ if (status2 != cudaSuccess) {
+ throw std::runtime_error("CUDA cudaFree error with status: "+ToString(static_cast<int>(status2)));
+ }
+ *buffer_cuda = nullptr;
}
#else
template <typename T> void CUDAToHost(T*, const std::vector<T>&, const size_t) { }
@@ -48,14 +78,22 @@ namespace clblast {
// Allocates space on the CUDA device and copies in data from the host
#ifdef CLBLAST_REF_CUBLAS
template <typename T>
- void HostToCUDA(T* buffer_cuda, std::vector<T> &buffer_host, const size_t size) {
- cudaMalloc(reinterpret_cast<void**>(&buffer_cuda), size*sizeof(T));
- cudaMemcpy(
- reinterpret_cast<void*>(buffer_cuda),
+ void HostToCUDA(T** buffer_cuda, std::vector<T> &buffer_host, const size_t size) {
+ if (*buffer_cuda == nullptr) {
+ auto status1 = cudaMalloc(reinterpret_cast<void**>(buffer_cuda), size*sizeof(T));
+ if (status1 != cudaSuccess) {
+ throw std::runtime_error("CUDA cudaMalloc error with status: "+ToString(static_cast<int>(status1)));
+ }
+ }
+ auto status2 = cudaMemcpy(
+ reinterpret_cast<void*>(*buffer_cuda),
reinterpret_cast<void*>(buffer_host.data()),
size*sizeof(T),
cudaMemcpyHostToDevice
);
+ if (status2 != cudaSuccess) {
+ throw std::runtime_error("CUDA cudaMemcpy error with status: "+ToString(static_cast<int>(status2)));
+ }
}
#else
template <typename T> void HostToCUDA(T*, const std::vector<T>&, const size_t) { }
@@ -65,26 +103,26 @@ namespace clblast {
template <typename T>
struct BuffersCUDA {
- T* x_vec;
- T* y_vec;
- T* a_mat;
- T* b_mat;
- T* c_mat;
- T* ap_mat;
- T* scalar;
+ T* x_vec = nullptr;
+ T* y_vec = nullptr;
+ T* a_mat = nullptr;
+ T* b_mat = nullptr;
+ T* c_mat = nullptr;
+ T* ap_mat = nullptr;
+ T* scalar = nullptr;
};
template <typename T, typename U>
void CUDAToHost(const Arguments<U> &args, BuffersCUDA<T> &buffers, BuffersHost<T> &buffers_host,
const std::vector<std::string> &names) {
for (auto &name: names) {
- if (name == kBufVecX) { buffers_host.x_vec = std::vector<T>(args.x_size, static_cast<T>(0)); CUDAToHost(buffers.x_vec, buffers_host.x_vec, args.x_size); }
- else if (name == kBufVecY) { buffers_host.y_vec = std::vector<T>(args.y_size, static_cast<T>(0)); CUDAToHost(buffers.y_vec, buffers_host.y_vec, args.y_size); }
- else if (name == kBufMatA) { buffers_host.a_mat = std::vector<T>(args.a_size, static_cast<T>(0)); CUDAToHost(buffers.a_mat, buffers_host.a_mat, args.a_size); }
- else if (name == kBufMatB) { buffers_host.b_mat = std::vector<T>(args.b_size, static_cast<T>(0)); CUDAToHost(buffers.b_mat, buffers_host.b_mat, args.b_size); }
- else if (name == kBufMatC) { buffers_host.c_mat = std::vector<T>(args.c_size, static_cast<T>(0)); CUDAToHost(buffers.c_mat, buffers_host.c_mat, args.c_size); }
- else if (name == kBufMatAP) { buffers_host.ap_mat = std::vector<T>(args.ap_size, static_cast<T>(0)); CUDAToHost(buffers.ap_mat, buffers_host.ap_mat, args.ap_size); }
- else if (name == kBufScalar) { buffers_host.scalar = std::vector<T>(args.scalar_size, static_cast<T>(0)); CUDAToHost(buffers.scalar, buffers_host.scalar, args.scalar_size); }
+ if (name == kBufVecX) { buffers_host.x_vec = std::vector<T>(args.x_size, static_cast<T>(0)); CUDAToHost(&buffers.x_vec, buffers_host.x_vec, args.x_size); }
+ else if (name == kBufVecY) { buffers_host.y_vec = std::vector<T>(args.y_size, static_cast<T>(0)); CUDAToHost(&buffers.y_vec, buffers_host.y_vec, args.y_size); }
+ else if (name == kBufMatA) { buffers_host.a_mat = std::vector<T>(args.a_size, static_cast<T>(0)); CUDAToHost(&buffers.a_mat, buffers_host.a_mat, args.a_size); }
+ else if (name == kBufMatB) { buffers_host.b_mat = std::vector<T>(args.b_size, static_cast<T>(0)); CUDAToHost(&buffers.b_mat, buffers_host.b_mat, args.b_size); }
+ else if (name == kBufMatC) { buffers_host.c_mat = std::vector<T>(args.c_size, static_cast<T>(0)); CUDAToHost(&buffers.c_mat, buffers_host.c_mat, args.c_size); }
+ else if (name == kBufMatAP) { buffers_host.ap_mat = std::vector<T>(args.ap_size, static_cast<T>(0)); CUDAToHost(&buffers.ap_mat, buffers_host.ap_mat, args.ap_size); }
+ else if (name == kBufScalar) { buffers_host.scalar = std::vector<T>(args.scalar_size, static_cast<T>(0)); CUDAToHost(&buffers.scalar, buffers_host.scalar, args.scalar_size); }
else { throw std::runtime_error("Invalid buffer name"); }
}
}
@@ -93,13 +131,13 @@ template <typename T, typename U>
void HostToCUDA(const Arguments<U> &args, BuffersCUDA<T> &buffers, BuffersHost<T> &buffers_host,
const std::vector<std::string> &names) {
for (auto &name: names) {
- if (name == kBufVecX) { HostToCUDA(buffers.x_vec, buffers_host.x_vec, args.x_size); }
- else if (name == kBufVecY) { HostToCUDA(buffers.y_vec, buffers_host.y_vec, args.y_size); }
- else if (name == kBufMatA) { HostToCUDA(buffers.a_mat, buffers_host.a_mat, args.a_size); }
- else if (name == kBufMatB) { HostToCUDA(buffers.b_mat, buffers_host.b_mat, args.b_size); }
- else if (name == kBufMatC) { HostToCUDA(buffers.c_mat, buffers_host.c_mat, args.c_size); }
- else if (name == kBufMatAP) { HostToCUDA(buffers.ap_mat, buffers_host.ap_mat, args.ap_size); }
- else if (name == kBufScalar) { HostToCUDA(buffers.scalar, buffers_host.scalar, args.scalar_size); }
+ if (name == kBufVecX) { HostToCUDA(&buffers.x_vec, buffers_host.x_vec, args.x_size); }
+ else if (name == kBufVecY) { HostToCUDA(&buffers.y_vec, buffers_host.y_vec, args.y_size); }
+ else if (name == kBufMatA) { HostToCUDA(&buffers.a_mat, buffers_host.a_mat, args.a_size); }
+ else if (name == kBufMatB) { HostToCUDA(&buffers.b_mat, buffers_host.b_mat, args.b_size); }
+ else if (name == kBufMatC) { HostToCUDA(&buffers.c_mat, buffers_host.c_mat, args.c_size); }
+ else if (name == kBufMatAP) { HostToCUDA(&buffers.ap_mat, buffers_host.ap_mat, args.ap_size); }
+ else if (name == kBufScalar) { HostToCUDA(&buffers.scalar, buffers_host.scalar, args.scalar_size); }
else { throw std::runtime_error("Invalid buffer name"); }
}
}