88
99#include < cuda_runtime.h>
1010#include < gtest/gtest.h>
11+ #include < memory>
1112#include < random>
1213#include < tuple>
1314#include < vector>
@@ -147,54 +148,42 @@ protected:
147148 initRandomMatrix (h_A_.data (), M_ , K_ , -1 .0f , 1 .0f , 42 );
148149 initRandomMatrix (h_B_.data (), K_ , N_ , -1 .0f , 1 .0f , 123 );
149150
150- CUDA_CHECK ( cudaMalloc (& d_A_, M_ * K_ * sizeof ( float )) );
151- CUDA_CHECK ( cudaMalloc (& d_B_, K_ * N_ * sizeof ( float )) );
152- CUDA_CHECK ( cudaMalloc (& d_C_, M_ * N_ * sizeof ( float )) );
153- CUDA_CHECK ( cudaMalloc (& d_C_ref_, M_ * N_ * sizeof ( float )) );
151+ d_A_ = std::make_unique<DeviceMemory< float >>( M_ * K_ );
152+ d_B_ = std::make_unique<DeviceMemory< float >>( K_ * N_ );
153+ d_C_ = std::make_unique<DeviceMemory< float >>( M_ * N_ );
154+ d_C_ref_ = std::make_unique<DeviceMemory< float >>( M_ * N_ );
154155
155- CUDA_CHECK ( cudaMemcpy ( d_A_, h_A_.data (), M_ * K_ * sizeof ( float ), cudaMemcpyHostToDevice) );
156- CUDA_CHECK ( cudaMemcpy ( d_B_, h_B_.data (), K_ * N_ * sizeof ( float ), cudaMemcpyHostToDevice) );
156+ d_A_-> copyFromHost ( h_A_.data (), M_ * K_ );
157+ d_B_-> copyFromHost ( h_B_.data (), K_ * N_ );
157158
158- verifier_.computeReference (d_A_, d_B_, d_C_ref_, M_ , K_ , N_ );
159- CUDA_CHECK (
160- cudaMemcpy (h_C_ref_.data (), d_C_ref_, M_ * N_ * sizeof (float ), cudaMemcpyDeviceToHost));
161- }
162-
163- void TearDown () override {
164- if (d_A_)
165- cudaFree (d_A_);
166- if (d_B_)
167- cudaFree (d_B_);
168- if (d_C_)
169- cudaFree (d_C_);
170- if (d_C_ref_)
171- cudaFree (d_C_ref_);
159+ verifier_.computeReference (d_A_->get (), d_B_->get (), d_C_ref_->get (), M_ , K_ , N_ );
160+ d_C_ref_->copyToHost (h_C_ref_.data (), M_ * N_ );
172161 }
173162
174163 template <typename LaunchFn>
175164 VerifyResult runKernelAndCompare (LaunchFn launch_fn,
176165 VerifyTolerance tolerance = kStandardVerifyTolerance ) {
177- CUDA_CHECK ( cudaMemset ( d_C_, 0 , M_ * N_ * sizeof ( float )) );
166+ d_C_-> zero ( );
178167 launch_fn ();
179168 CUDA_CHECK (cudaDeviceSynchronize ());
180- CUDA_CHECK ( cudaMemcpy ( h_C_.data (), d_C_, M_ * N_ * sizeof ( float ), cudaMemcpyDeviceToHost) );
169+ d_C_-> copyToHost ( h_C_.data (), M_ * N_ );
181170 return compareMatrices (h_C_.data (), h_C_ref_.data (), M_ , N_ , tolerance);
182171 }
183172
184173 int M_ , K_ , N_ ;
185174 std::vector<float > h_A_, h_B_, h_C_, h_C_ref_;
186- float * d_A_ = nullptr ;
187- float * d_B_ = nullptr ;
188- float * d_C_ = nullptr ;
189- float * d_C_ref_ = nullptr ;
175+ std::unique_ptr<DeviceMemory< float >> d_A_;
176+ std::unique_ptr<DeviceMemory< float >> d_B_;
177+ std::unique_ptr<DeviceMemory< float >> d_C_;
178+ std::unique_ptr<DeviceMemory< float >> d_C_ref_;
190179 SGEMMVerifier verifier_;
191180};
192181
193182class NaiveSGEMMTest : public SGEMMKernelTest {};
194183
195184TEST_P (NaiveSGEMMTest, CorrectnessProperty) {
196185 VerifyResult result =
197- runKernelAndCompare ([&] { launch_naive_sgemm<>(d_A_, d_B_, d_C_, M_ , K_ , N_ ); });
186+ runKernelAndCompare ([&] { launch_naive_sgemm<>(d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); });
198187
199188 EXPECT_TRUE (result.passed ) << " Naive SGEMM failed for dimensions " << M_ << " x" << K_ << " x" << N_
200189 << " (max_rel_error: " << result.max_rel_error << " )" ;
@@ -207,7 +196,7 @@ class TiledSGEMMTest : public SGEMMKernelTest {};
207196
208197TEST_P (TiledSGEMMTest, CorrectnessProperty) {
209198 VerifyResult result =
210- runKernelAndCompare ([&] { launch_tiled_sgemm<32 >(d_A_, d_B_, d_C_, M_ , K_ , N_ ); });
199+ runKernelAndCompare ([&] { launch_tiled_sgemm<32 >(d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); });
211200
212201 EXPECT_TRUE (result.passed ) << " Tiled SGEMM failed for dimensions " << M_ << " x" << K_ << " x" << N_
213202 << " (max_rel_error: " << result.max_rel_error << " )" ;
@@ -220,7 +209,7 @@ class BankConflictFreeSGEMMTest : public SGEMMKernelTest {};
220209
221210TEST_P (BankConflictFreeSGEMMTest, CorrectnessProperty) {
222211 VerifyResult result = runKernelAndCompare (
223- [&] { launch_bank_conflict_free_sgemm<32 >(d_A_, d_B_, d_C_, M_ , K_ , N_ ); });
212+ [&] { launch_bank_conflict_free_sgemm<32 >(d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); });
224213
225214 EXPECT_TRUE (result.passed ) << " BankConflictFree SGEMM failed for dimensions " << M_ << " x" << K_
226215 << " x" << N_ << " (max_rel_error: " << result.max_rel_error << " )" ;
@@ -233,7 +222,7 @@ class DoubleBufferSGEMMTest : public SGEMMKernelTest {};
233222
234223TEST_P (DoubleBufferSGEMMTest, CorrectnessProperty) {
235224 VerifyResult result =
236- runKernelAndCompare ([&] { launch_double_buffer_sgemm<32 >(d_A_, d_B_, d_C_, M_ , K_ , N_ ); });
225+ runKernelAndCompare ([&] { launch_double_buffer_sgemm<32 >(d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); });
237226
238227 EXPECT_TRUE (result.passed ) << " DoubleBuffer SGEMM failed for dimensions " << M_ << " x" << K_
239228 << " x" << N_ << " (max_rel_error: " << result.max_rel_error << " )" ;
@@ -252,7 +241,7 @@ TEST_P(TensorCoreSGEMMTest, FastPathCorrectnessProperty) {
252241 ASSERT_TRUE (tensorCoreDimensionsSupported (M_ , K_ , N_ ));
253242
254243 VerifyResult result = runKernelAndCompare (
255- [&] { launch_tensor_core_sgemm (d_A_, d_B_, d_C_, M_ , K_ , N_ ); }, kTensorCoreVerifyTolerance );
244+ [&] { launch_tensor_core_sgemm (d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); }, kTensorCoreVerifyTolerance );
256245
257246 EXPECT_TRUE (result.passed ) << " TensorCore SGEMM fast path failed for dimensions " << M_ << " x"
258247 << K_ << " x" << N_ << " (max_rel_error: " << result.max_rel_error
@@ -266,7 +255,7 @@ class TensorCoreFallbackTest : public SGEMMKernelTest {};
266255
267256TEST_P (TensorCoreFallbackTest, NonAlignedInputsFallbackSafely) {
268257 VerifyResult result = runKernelAndCompare (
269- [&] { launch_tensor_core_sgemm (d_A_, d_B_, d_C_, M_ , K_ , N_ ); }, kStandardVerifyTolerance );
258+ [&] { launch_tensor_core_sgemm (d_A_-> get () , d_B_-> get () , d_C_-> get () , M_ , K_ , N_ ); }, kStandardVerifyTolerance );
270259
271260 EXPECT_TRUE (result.passed ) << " TensorCore fallback failed for dimensions " << M_ << " x" << K_
272261 << " x" << N_ << " (max_rel_error: " << result.max_rel_error << " )" ;
@@ -303,26 +292,22 @@ TEST_F(DimensionInvarianceTest, AllStandardKernelsWorkWithVariousDimensions) {
303292 initRandomMatrix (h_A.data (), M, K, -1 .0f , 1 .0f , iter);
304293 initRandomMatrix (h_B.data (), K, N, -1 .0f , 1 .0f , iter + 1000 );
305294
306- float *d_A = nullptr ;
307- float *d_B = nullptr ;
308- float *d_C = nullptr ;
309- float *d_ref = nullptr ;
310- CUDA_CHECK (cudaMalloc (&d_A, M * K * sizeof (float )));
311- CUDA_CHECK (cudaMalloc (&d_B, K * N * sizeof (float )));
312- CUDA_CHECK (cudaMalloc (&d_C, M * N * sizeof (float )));
313- CUDA_CHECK (cudaMalloc (&d_ref, M * N * sizeof (float )));
295+ DeviceMemory<float > d_A (M * K);
296+ DeviceMemory<float > d_B (K * N);
297+ DeviceMemory<float > d_C (M * N);
298+ DeviceMemory<float > d_ref (M * N);
314299
315- CUDA_CHECK ( cudaMemcpy ( d_A, h_A.data (), M * K * sizeof ( float ), cudaMemcpyHostToDevice) );
316- CUDA_CHECK ( cudaMemcpy ( d_B, h_B.data (), K * N * sizeof ( float ), cudaMemcpyHostToDevice) );
300+ d_A. copyFromHost ( h_A.data (), M * K);
301+ d_B. copyFromHost ( h_B.data (), K * N);
317302
318- computeReference (handle_, d_A, d_B, d_ref, M, K, N);
319- CUDA_CHECK ( cudaMemcpy ( h_ref.data (), d_ref, M * N * sizeof ( float ), cudaMemcpyDeviceToHost) );
303+ computeReference (handle_, d_A. get () , d_B. get () , d_ref. get () , M, K, N);
304+ d_ref. copyToHost ( h_ref.data (), M * N);
320305
321306 auto testKernel = [&](const char *name, auto kernel_func) {
322- CUDA_CHECK ( cudaMemset ( d_C, 0 , M * N * sizeof ( float )) );
323- kernel_func (d_A, d_B, d_C, M, K, N);
307+ d_C. zero ( );
308+ kernel_func (d_A. get () , d_B. get () , d_C. get () , M, K, N);
324309 CUDA_CHECK (cudaDeviceSynchronize ());
325- CUDA_CHECK ( cudaMemcpy ( h_C.data (), d_C, M * N * sizeof ( float ), cudaMemcpyDeviceToHost) );
310+ d_C. copyToHost ( h_C.data (), M * N);
326311
327312 VerifyResult result =
328313 compareMatrices (h_C.data (), h_ref.data (), M, N, kStandardVerifyTolerance );
@@ -334,11 +319,6 @@ TEST_F(DimensionInvarianceTest, AllStandardKernelsWorkWithVariousDimensions) {
334319 testKernel (" Tiled" , launch_tiled_sgemm<32 >);
335320 testKernel (" BankConflictFree" , launch_bank_conflict_free_sgemm<32 >);
336321 testKernel (" DoubleBuffer" , launch_double_buffer_sgemm<32 >);
337-
338- cudaFree (d_A);
339- cudaFree (d_B);
340- cudaFree (d_C);
341- cudaFree (d_ref);
342322 }
343323}
344324
0 commit comments