cxx11_tensor_volume_patch_sycl.cpp File Reference
#include "main.h"
#include <unsupported/Eigen/CXX11/Tensor>

Macros

#define EIGEN_TEST_NO_LONGDOUBLE
 
#define EIGEN_TEST_NO_COMPLEX
 
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE   int64_t
 
#define EIGEN_USE_SYCL
 

Functions

template<typename DataType , typename IndexType >
static void test_single_voxel_patch_sycl (const Eigen::SyclDevice &sycl_device)
 
template<typename DataType , typename IndexType >
static void test_entire_volume_patch_sycl (const Eigen::SyclDevice &sycl_device)
 
template<typename DataType , typename dev_Selector >
void sycl_tensor_volume_patch_test_per_device (dev_Selector s)
 
 EIGEN_DECLARE_TEST (cxx11_tensor_volume_patch_sycl)
 

Variables

static const int DataLayout = ColMajor
 

Macro Definition Documentation

◆ EIGEN_DEFAULT_DENSE_INDEX_TYPE

#define EIGEN_DEFAULT_DENSE_INDEX_TYPE   int64_t

◆ EIGEN_TEST_NO_COMPLEX

#define EIGEN_TEST_NO_COMPLEX

◆ EIGEN_TEST_NO_LONGDOUBLE

#define EIGEN_TEST_NO_LONGDOUBLE

◆ EIGEN_USE_SYCL

#define EIGEN_USE_SYCL

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( cxx11_tensor_volume_patch_sycl  )
224  {
225  for (const auto& device : Eigen::get_sycl_supported_devices()) {
226  CALL_SUBTEST(sycl_tensor_volume_patch_test_per_device<half>(device));
227  CALL_SUBTEST(sycl_tensor_volume_patch_test_per_device<float>(device));
228  }
229 }
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST.

◆ sycl_tensor_volume_patch_test_per_device()

template<typename DataType , typename dev_Selector >
void sycl_tensor_volume_patch_test_per_device ( dev_Selector  s)
217  {
218  QueueInterface queueInterface(s);
219  auto sycl_device = Eigen::SyclDevice(&queueInterface);
220  std::cout << "Running on " << s.template get_info<cl::sycl::info::device::name>() << std::endl;
221  test_single_voxel_patch_sycl<DataType, int64_t>(sycl_device);
222  test_entire_volume_patch_sycl<DataType, int64_t>(sycl_device);
223 }
RealScalar s
Definition: level1_cplx_impl.h:130

References s.

◆ test_entire_volume_patch_sycl()

template<typename DataType , typename IndexType >
static void test_entire_volume_patch_sycl ( const Eigen::SyclDevice &  sycl_device)
static
100  {
101  const int depth = 4;
102  const int patch_z = 2;
103  const int patch_y = 3;
104  const int patch_x = 5;
105  const int batch = 7;
106 
107  array<IndexType, 5> tensorColMajorRange = {{depth, patch_z, patch_y, patch_x, batch}};
108  array<IndexType, 5> tensorRowMajorRange = {{batch, patch_x, patch_y, patch_z, depth}};
109  Tensor<DataType, 5, DataLayout, IndexType> tensor_col_major(tensorColMajorRange);
110  Tensor<DataType, 5, RowMajor, IndexType> tensor_row_major(tensorRowMajorRange);
111  tensor_col_major.setRandom();
112 
113  DataType* gpu_data_col_major =
114  static_cast<DataType*>(sycl_device.allocate(tensor_col_major.size() * sizeof(DataType)));
115  DataType* gpu_data_row_major =
116  static_cast<DataType*>(sycl_device.allocate(tensor_row_major.size() * sizeof(DataType)));
117  TensorMap<Tensor<DataType, 5, ColMajor, IndexType>> gpu_col_major(gpu_data_col_major, tensorColMajorRange);
118  TensorMap<Tensor<DataType, 5, RowMajor, IndexType>> gpu_row_major(gpu_data_row_major, tensorRowMajorRange);
119 
120  sycl_device.memcpyHostToDevice(gpu_data_col_major, tensor_col_major.data(),
121  (tensor_col_major.size()) * sizeof(DataType));
122  gpu_row_major.device(sycl_device) = gpu_col_major.swap_layout();
123  sycl_device.memcpyDeviceToHost(tensor_row_major.data(), gpu_data_row_major,
124  (tensor_col_major.size()) * sizeof(DataType));
125 
126  // single volume patch: ColMajor
127  array<IndexType, 6> patchColMajorTensorRange = {
128  {depth, patch_z, patch_y, patch_x, patch_z * patch_y * patch_x, batch}};
129  Tensor<DataType, 6, DataLayout, IndexType> entire_volume_patch_col_major(patchColMajorTensorRange);
130  size_t patchTensorBuffSize = entire_volume_patch_col_major.size() * sizeof(DataType);
131  DataType* gpu_data_entire_volume_patch_col_major = static_cast<DataType*>(sycl_device.allocate(patchTensorBuffSize));
132  TensorMap<Tensor<DataType, 6, DataLayout, IndexType>> gpu_entire_volume_patch_col_major(
133  gpu_data_entire_volume_patch_col_major, patchColMajorTensorRange);
134  gpu_entire_volume_patch_col_major.device(sycl_device) =
135  gpu_col_major.extract_volume_patches(patch_z, patch_y, patch_x);
136  sycl_device.memcpyDeviceToHost(entire_volume_patch_col_major.data(), gpu_data_entire_volume_patch_col_major,
137  patchTensorBuffSize);
138 
139  // Tensor<float, 5> tensor(depth, patch_z, patch_y, patch_x, batch);
140  // tensor.setRandom();
141  // Tensor<float, 5, RowMajor> tensor_row_major = tensor.swap_layout();
142 
143  // Tensor<float, 6> entire_volume_patch;
144  // entire_volume_patch = tensor.extract_volume_patches(patch_z, patch_y, patch_x);
145  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(0), depth);
146  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(1), patch_z);
147  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(2), patch_y);
148  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(3), patch_x);
149  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(4), patch_z * patch_y * patch_x);
150  VERIFY_IS_EQUAL(entire_volume_patch_col_major.dimension(5), batch);
151 
152  // Tensor<float, 6, RowMajor> entire_volume_patch_row_major;
153  // entire_volume_patch_row_major = tensor_row_major.extract_volume_patches(patch_z, patch_y, patch_x);
154 
155  array<IndexType, 6> patchRowMajorTensorRange = {
156  {batch, patch_z * patch_y * patch_x, patch_x, patch_y, patch_z, depth}};
157  Tensor<DataType, 6, RowMajor, IndexType> entire_volume_patch_row_major(patchRowMajorTensorRange);
158  patchTensorBuffSize = entire_volume_patch_row_major.size() * sizeof(DataType);
159  DataType* gpu_data_entire_volume_patch_row_major = static_cast<DataType*>(sycl_device.allocate(patchTensorBuffSize));
160  TensorMap<Tensor<DataType, 6, RowMajor, IndexType>> gpu_entire_volume_patch_row_major(
161  gpu_data_entire_volume_patch_row_major, patchRowMajorTensorRange);
162  gpu_entire_volume_patch_row_major.device(sycl_device) =
163  gpu_row_major.extract_volume_patches(patch_z, patch_y, patch_x);
164  sycl_device.memcpyDeviceToHost(entire_volume_patch_row_major.data(), gpu_data_entire_volume_patch_row_major,
165  patchTensorBuffSize);
166 
167  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(0), batch);
168  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(1), patch_z * patch_y * patch_x);
169  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(2), patch_x);
170  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(3), patch_y);
171  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(4), patch_z);
172  VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(5), depth);
173 
174  const int dz = patch_z - 1;
175  const int dy = patch_y - 1;
176  const int dx = patch_x - 1;
177 
178  const int forward_pad_z = dz / 2;
179  const int forward_pad_y = dy / 2;
180  const int forward_pad_x = dx / 2;
181 
182  for (int pz = 0; pz < patch_z; pz++) {
183  for (int py = 0; py < patch_y; py++) {
184  for (int px = 0; px < patch_x; px++) {
185  const int patchId = pz + patch_z * (py + px * patch_y);
186  for (int z = 0; z < patch_z; z++) {
187  for (int y = 0; y < patch_y; y++) {
188  for (int x = 0; x < patch_x; x++) {
189  for (int b = 0; b < batch; b++) {
190  for (int d = 0; d < depth; d++) {
191  float expected = 0.0f;
192  float expected_row_major = 0.0f;
193  const int eff_z = z - forward_pad_z + pz;
194  const int eff_y = y - forward_pad_y + py;
195  const int eff_x = x - forward_pad_x + px;
196  if (eff_z >= 0 && eff_y >= 0 && eff_x >= 0 && eff_z < patch_z && eff_y < patch_y && eff_x < patch_x) {
197  expected = tensor_col_major(d, eff_z, eff_y, eff_x, b);
198  expected_row_major = tensor_row_major(b, eff_x, eff_y, eff_z, d);
199  }
200  VERIFY_IS_EQUAL(entire_volume_patch_col_major(d, z, y, x, patchId, b), expected);
201  VERIFY_IS_EQUAL(entire_volume_patch_row_major(b, patchId, x, y, z, d), expected_row_major);
202  }
203  }
204  }
205  }
206  }
207  }
208  }
209  }
210  sycl_device.deallocate(gpu_data_col_major);
211  sycl_device.deallocate(gpu_data_row_major);
212  sycl_device.deallocate(gpu_data_entire_volume_patch_col_major);
213  sycl_device.deallocate(gpu_data_entire_volume_patch_row_major);
214 }
Scalar * b
Definition: benchVecAdd.cpp:17
A tensor expression mapping an existing array of data.
Definition: TensorMap.h:33
The tensor class.
Definition: Tensor.h:68
RealScalar RealScalar * px
Definition: level1_cplx_impl.h:27
Scalar * y
Definition: level1_cplx_impl.h:128
int RealScalar int RealScalar * py
Definition: level1_cplx_impl.h:124
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
std::array< T, N > array
Definition: EmulateArray.h:231
list x
Definition: plotDoE.py:28

References b, Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::data(), Eigen::TensorBase< Derived, AccessLevel >::device(), Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimension(), px, py, Eigen::TensorBase< Derived, AccessLevel >::setRandom(), Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::size(), Eigen::TensorBase< Derived, AccessLevel >::swap_layout(), VERIFY_IS_EQUAL, plotDoE::x, and y.

◆ test_single_voxel_patch_sycl()

template<typename DataType , typename IndexType >
static void test_single_voxel_patch_sycl ( const Eigen::SyclDevice &  sycl_device)
static
27  {
28  IndexType sizeDim0 = 4;
29  IndexType sizeDim1 = 2;
30  IndexType sizeDim2 = 3;
31  IndexType sizeDim3 = 5;
32  IndexType sizeDim4 = 7;
33  array<IndexType, 5> tensorColMajorRange = {{sizeDim0, sizeDim1, sizeDim2, sizeDim3, sizeDim4}};
34  array<IndexType, 5> tensorRowMajorRange = {{sizeDim4, sizeDim3, sizeDim2, sizeDim1, sizeDim0}};
35  Tensor<DataType, 5, DataLayout, IndexType> tensor_col_major(tensorColMajorRange);
36  Tensor<DataType, 5, RowMajor, IndexType> tensor_row_major(tensorRowMajorRange);
37  tensor_col_major.setRandom();
38 
39  DataType* gpu_data_col_major =
40  static_cast<DataType*>(sycl_device.allocate(tensor_col_major.size() * sizeof(DataType)));
41  DataType* gpu_data_row_major =
42  static_cast<DataType*>(sycl_device.allocate(tensor_row_major.size() * sizeof(DataType)));
43  TensorMap<Tensor<DataType, 5, ColMajor, IndexType>> gpu_col_major(gpu_data_col_major, tensorColMajorRange);
44  TensorMap<Tensor<DataType, 5, RowMajor, IndexType>> gpu_row_major(gpu_data_row_major, tensorRowMajorRange);
45 
46  sycl_device.memcpyHostToDevice(gpu_data_col_major, tensor_col_major.data(),
47  (tensor_col_major.size()) * sizeof(DataType));
48  gpu_row_major.device(sycl_device) = gpu_col_major.swap_layout();
49 
50  // single volume patch: ColMajor
51  array<IndexType, 6> patchColMajorTensorRange = {{sizeDim0, 1, 1, 1, sizeDim1 * sizeDim2 * sizeDim3, sizeDim4}};
52  Tensor<DataType, 6, DataLayout, IndexType> single_voxel_patch_col_major(patchColMajorTensorRange);
53  size_t patchTensorBuffSize = single_voxel_patch_col_major.size() * sizeof(DataType);
54  DataType* gpu_data_single_voxel_patch_col_major = static_cast<DataType*>(sycl_device.allocate(patchTensorBuffSize));
55  TensorMap<Tensor<DataType, 6, DataLayout, IndexType>> gpu_single_voxel_patch_col_major(
56  gpu_data_single_voxel_patch_col_major, patchColMajorTensorRange);
57  gpu_single_voxel_patch_col_major.device(sycl_device) = gpu_col_major.extract_volume_patches(1, 1, 1);
58  sycl_device.memcpyDeviceToHost(single_voxel_patch_col_major.data(), gpu_data_single_voxel_patch_col_major,
59  patchTensorBuffSize);
60 
61  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(0), 4);
62  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(1), 1);
63  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(2), 1);
64  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(3), 1);
65  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(4), 2 * 3 * 5);
66  VERIFY_IS_EQUAL(single_voxel_patch_col_major.dimension(5), 7);
67 
68  array<IndexType, 6> patchRowMajorTensorRange = {{sizeDim4, sizeDim1 * sizeDim2 * sizeDim3, 1, 1, 1, sizeDim0}};
69  Tensor<DataType, 6, RowMajor, IndexType> single_voxel_patch_row_major(patchRowMajorTensorRange);
70  patchTensorBuffSize = single_voxel_patch_row_major.size() * sizeof(DataType);
71  DataType* gpu_data_single_voxel_patch_row_major = static_cast<DataType*>(sycl_device.allocate(patchTensorBuffSize));
72  TensorMap<Tensor<DataType, 6, RowMajor, IndexType>> gpu_single_voxel_patch_row_major(
73  gpu_data_single_voxel_patch_row_major, patchRowMajorTensorRange);
74  gpu_single_voxel_patch_row_major.device(sycl_device) = gpu_row_major.extract_volume_patches(1, 1, 1);
75  sycl_device.memcpyDeviceToHost(single_voxel_patch_row_major.data(), gpu_data_single_voxel_patch_row_major,
76  patchTensorBuffSize);
77 
78  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(0), 7);
79  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(1), 2 * 3 * 5);
80  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(2), 1);
81  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(3), 1);
82  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(4), 1);
83  VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(5), 4);
84 
85  sycl_device.memcpyDeviceToHost(tensor_row_major.data(), gpu_data_row_major,
86  (tensor_col_major.size()) * sizeof(DataType));
87  for (IndexType i = 0; i < tensor_col_major.size(); ++i) {
88  VERIFY_IS_EQUAL(tensor_col_major.data()[i], single_voxel_patch_col_major.data()[i]);
89  VERIFY_IS_EQUAL(tensor_row_major.data()[i], single_voxel_patch_row_major.data()[i]);
90  VERIFY_IS_EQUAL(tensor_col_major.data()[i], tensor_row_major.data()[i]);
91  }
92 
93  sycl_device.deallocate(gpu_data_col_major);
94  sycl_device.deallocate(gpu_data_row_major);
95  sycl_device.deallocate(gpu_data_single_voxel_patch_col_major);
96  sycl_device.deallocate(gpu_data_single_voxel_patch_row_major);
97 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::data(), Eigen::TensorBase< Derived, AccessLevel >::device(), Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimension(), i, Eigen::TensorBase< Derived, AccessLevel >::setRandom(), Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::size(), Eigen::TensorBase< Derived, AccessLevel >::swap_layout(), and VERIFY_IS_EQUAL.

Variable Documentation

◆ DataLayout

const int DataLayout = ColMajor
static