/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/device_memory.hpp Source File

/home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/device_memory.hpp Source File#

Composable Kernel: /home/docs/checkouts/readthedocs.org/user_builds/advanced-micro-devices-composable-kernel/checkouts/develop/include/ck/library/utility/device_memory.hpp Source File
device_memory.hpp
Go to the documentation of this file.
1 // Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
2 // SPDX-License-Identifier: MIT
3 
4 #pragma once
5 
6 #include <hip/hip_runtime.h>
7 #include <math.h>
9 
10 namespace ck {
11 
12 template <typename T>
13 __global__ void set_buffer_value(T* p, T x, uint64_t buffer_element_size)
14 {
15  for(uint64_t i = threadIdx.x; i < buffer_element_size; i += blockDim.x)
16  {
17  p[i] = x;
18  }
19 }
20 
25 struct DeviceMem
26 {
27  DeviceMem() : mpDeviceBuf(nullptr), mMemSize(0) {}
28  DeviceMem(std::size_t mem_size);
29  void Realloc(std::size_t mem_size);
30  void* GetDeviceBuffer() const;
31  std::size_t GetBufferSize() const;
32  void ToDevice(const void* p) const;
33  void ToDevice(const void* p, const std::size_t cpySize) const;
34  void FromDevice(void* p) const;
35  void FromDevice(void* p, const std::size_t cpySize) const;
36  void SetZero() const;
37  template <typename T>
38  void SetValue(T x) const;
39  template <typename T>
40  void FillUniformRandInteger(int min_value, int max_value);
41  template <typename T>
42  void FillUniformRandFp(float min_value, float max_value);
43  template <typename T>
44  void FillNormalRandFp(float sigma, float mean);
46 
47  void* mpDeviceBuf;
48  std::size_t mMemSize;
49 };
50 
51 template <typename T>
52 void DeviceMem::SetValue(T x) const
53 {
54  if(mMemSize % sizeof(T) != 0)
55  {
56  throw std::runtime_error("wrong! not entire DeviceMem will be set");
57  }
58 
59  set_buffer_value<T><<<1, 1024>>>(static_cast<T*>(mpDeviceBuf), x, mMemSize / sizeof(T));
60 }
61 
62 template <typename T>
63 void DeviceMem::FillUniformRandInteger(int min_value, int max_value)
64 {
65  if(mMemSize % sizeof(T) != 0)
66  {
67  throw std::runtime_error("wrong! not entire DeviceMem will be filled");
68  }
69  if(max_value - min_value <= 1)
70  {
71  throw std::runtime_error("Error while filling device tensor with random integer data: max "
72  "value must be at least 2 greater than min value, otherwise "
73  "tensor will be filled by a constant value (end is exclusive)");
74  }
75  if(max_value - 1 == min_value || max_value - 1 == max_value)
76  {
77  throw std::runtime_error("Error while filling device tensor with random integer data: "
78  "insufficient precision in specified range");
79  }
80 
81  size_t packed_size = packed_size_v<T>;
82  fill_tensor_uniform_rand_int_values<<<256, 256>>>(
83  static_cast<T*>(mpDeviceBuf), min_value, max_value, (mMemSize * packed_size) / sizeof(T));
84 }
85 
86 template <typename T>
87 void DeviceMem::FillUniformRandFp(float min_value, float max_value)
88 {
89  if(mMemSize % sizeof(T) != 0)
90  {
91  throw std::runtime_error("wrong! not entire DeviceMem will be filled");
92  }
93 
94  size_t packed_size = packed_size_v<T>;
95  fill_tensor_uniform_rand_fp_values<<<256, 256>>>(
96  static_cast<T*>(mpDeviceBuf), min_value, max_value, (mMemSize * packed_size) / sizeof(T));
97 }
98 
99 template <typename T>
100 void DeviceMem::FillNormalRandFp(float sigma, float mean)
101 {
102 
103  fill_tensor_norm_rand_fp_values<<<256, 256>>>(
104  static_cast<T*>(mpDeviceBuf), sigma, mean, mMemSize / sizeof(T));
105 }
106 } // namespace ck
Definition: ck.hpp:270
__global__ void set_buffer_value(T *p, T x, uint64_t buffer_element_size)
Definition: device_memory.hpp:13
unsigned __int64 uint64_t
Definition: stdint.h:136
Container for storing data in GPU device memory.
Definition: device_memory.hpp:26
void FromDevice(void *p) const
std::size_t GetBufferSize() const
void SetZero() const
void * mpDeviceBuf
Definition: device_memory.hpp:47
DeviceMem()
Definition: device_memory.hpp:27
void ToDevice(const void *p, const std::size_t cpySize) const
void FillNormalRandFp(float sigma, float mean)
Definition: device_memory.hpp:100
void FillUniformRandFp(float min_value, float max_value)
Definition: device_memory.hpp:87
DeviceMem(std::size_t mem_size)
void SetValue(T x) const
Definition: device_memory.hpp:52
void FromDevice(void *p, const std::size_t cpySize) const
void FillUniformRandInteger(int min_value, int max_value)
Definition: device_memory.hpp:63
void Realloc(std::size_t mem_size)
std::size_t mMemSize
Definition: device_memory.hpp:48
void * GetDeviceBuffer() const
void ToDevice(const void *p) const