8 #include "util/cuda_util.hpp"
10 #define BOOST_TEST_DYN_LINK
11 #include <boost/test/unit_test.hpp>
13 #include "Vector/map_vector.hpp"
14 #include "util/tokernel_transformation.hpp"
16 BOOST_AUTO_TEST_SUITE( vector_cuda_funcs_tests )
19 BOOST_AUTO_TEST_CASE( vector_cuda_funcs_add_prp_device )
29 for (
size_t i = 0 ; i < 100 ; i++)
31 vg_data.template get<0>(i) = 2.5 + i;
33 vg_data.template get<1>(i)[0] = 4.6 + i;
34 vg_data.template get<1>(i)[1] = 7.8 + i;
35 vg_data.template get<1>(i)[2] = 9.0 + i;
37 vg_data2.template get<0>(i) = 8.5 + i;
39 vg_data2.template get<1>(i)[0] = 1.6 + i;
40 vg_data2.template get<1>(i)[1] = 3.8 + i;
41 vg_data2.template get<1>(i)[2] = 5.1 + i;
44 vg_data.hostToDevice<0,1>();
45 vg_data2.hostToDevice<0,1>();
54 vg_data.deviceToHost<0,1>();
56 BOOST_REQUIRE_EQUAL(vg_data.
size(),200);
59 for (
unsigned int i = 100 ; i < 200 ; i++)
61 match &= vg_data.template get<0>(i) == vg_data2.template get<0>(i-100);
63 match &= vg_data.template get<1>(i)[0] == vg_data2.template get<1>(i-100)[0];
64 match &= vg_data.template get<1>(i)[1] == vg_data2.template get<1>(i-100)[1];
65 match &= vg_data.template get<1>(i)[2] == vg_data2.template get<1>(i-100)[2];
68 BOOST_REQUIRE_EQUAL(match,
true);
71 BOOST_AUTO_TEST_CASE( vector_cuda_to_kernel_recursive2 )
83 bool test = std::is_same<tker1,openfpm::vector_gpu_ker<aggregate<int, long>,
memory_traits_inte>>::value;
85 BOOST_REQUIRE_EQUAL(test,
true);
89 BOOST_REQUIRE_EQUAL(test,
true);
93 BOOST_REQUIRE_EQUAL(test,
true);
95 test = std::is_same<tker4,openfpm::vector_gpu_ker<Box<3,float>,
memory_traits_inte>>::value;
97 BOOST_REQUIRE_EQUAL(test,
true);
100 template<
typename vv_rc,
typename vector_output_type>
101 __global__
void kernel_recursive_check(vv_rc vvrc, vector_output_type vot)
104 for (
int i = 0 ; i < vvrc.size() ; i++)
106 for (
int j = 0 ; j < vvrc.template get<1>(i).size() ; j++)
108 vot.template get<0>(k) = vvrc.template get<1>(i).template get<0>(j);
114 BOOST_AUTO_TEST_CASE( vector_cuda_to_kernel_recursive2_test_toKernel )
130 tt2.template get<0>(0) = 80;
131 tt2.template get<1>(0).add();
132 tt2.template get<1>(0).template get<0>(0) = 500;
133 tt2.template get<0>(0) = 180;
134 tt2.template get<1>(0).add();
135 tt2.template get<1>(0).template get<0>(1) = 600;
136 tt2.template get<0>(0) = 280;;
137 tt2.template get<1>(0).add();
138 tt2.template get<1>(0).template get<0>(2) = 700;
139 tt2.template get<1>(0).template hostToDevice<0>();
141 tt2.template get<0>(1) = 10080;
142 tt2.template get<1>(1).add();
143 tt2.template get<1>(1).template get<0>(0) = 1500;
144 tt2.template get<0>(1) = 20080;
145 tt2.template get<1>(1).add();
146 tt2.template get<1>(1).template get<0>(1) = 1600;
147 tt2.template get<0>(1) = 30080;
148 tt2.template get<1>(1).add();
149 tt2.template get<1>(1).template get<0>(2) = 1700;
150 tt2.template get<1>(1).template hostToDevice<0>();
152 tt2.template get<0>(2) = 40080;
153 tt2.template get<1>(2).add();
154 tt2.template get<1>(2).template get<0>(0) = 2500;
155 tt2.template get<0>(2) = 50080;
156 tt2.template get<1>(2).add();
157 tt2.template get<1>(2).template get<0>(1) = 2600;
158 tt2.template get<0>(2) = 60080;
159 tt2.template get<1>(2).add();
160 tt2.template get<1>(2).template get<0>(2) = 2700;
161 tt2.template get<1>(2).template hostToDevice<0>();
163 tt2.template hostToDevice<1>();
167 CUDA_LAUNCH_DIM3(kernel_recursive_check,1,1,tt2.toKernel(),vg.toKernel());
169 vg.template deviceToHost<0>();
171 BOOST_REQUIRE_EQUAL(vg.template get<0>(0),500);
172 BOOST_REQUIRE_EQUAL(vg.template get<0>(1),600);
173 BOOST_REQUIRE_EQUAL(vg.template get<0>(2),700);
174 BOOST_REQUIRE_EQUAL(vg.template get<0>(3),1500);
175 BOOST_REQUIRE_EQUAL(vg.template get<0>(4),1600);
176 BOOST_REQUIRE_EQUAL(vg.template get<0>(5),1700);
177 BOOST_REQUIRE_EQUAL(vg.template get<0>(6),2500);
178 BOOST_REQUIRE_EQUAL(vg.template get<0>(7),2600);
179 BOOST_REQUIRE_EQUAL(vg.template get<0>(8),2700);
182 BOOST_AUTO_TEST_CASE( vector_cuda_to_cpu_operator_equal )
191 for (
size_t i = 0 ; i < 3000 ; i++)
193 v2.template get<0>(i) = i;
194 v2.template get<1>(i) = i+300;
195 v2.template get<2>(i) = i+6123.0;
202 for (
size_t i = 0 ; i < v2.
size() ; i++)
204 BOOST_REQUIRE_EQUAL(v2.template get<0>(i),v1.template get<0>(i));
205 BOOST_REQUIRE_EQUAL(v2.template get<0>(i),v3.template get<0>(i));
206 BOOST_REQUIRE_EQUAL(v2.template get<0>(i),v4.template get<0>(i));
208 BOOST_REQUIRE_EQUAL(v2.template get<1>(i),v1.template get<1>(i));
209 BOOST_REQUIRE_EQUAL(v2.template get<1>(i),v3.template get<1>(i));
210 BOOST_REQUIRE_EQUAL(v2.template get<1>(i),v4.template get<1>(i));
212 BOOST_REQUIRE_EQUAL(v2.template get<2>(i),v1.template get<2>(i));
213 BOOST_REQUIRE_EQUAL(v2.template get<2>(i),v3.template get<2>(i));
214 BOOST_REQUIRE_EQUAL(v2.template get<2>(i),v4.template get<2>(i));
219 BOOST_AUTO_TEST_CASE( vector_cuda_host_to_device_check )
225 for (
size_t i = 0 ; i < v1.
size() ; i++)
227 v1.template get<0>(i) = i;
228 v1.template get<1>(i) = i+300;
229 v1.template get<2>(i) = i+6123.0;
232 v1.hostToDevice<0,1,2>();
236 for (
size_t i = 0 ; i < v1.
size()-1 ; i++)
238 v1.template get<0>(i) = 0;
239 v1.template get<1>(i) = 0;
240 v1.template get<2>(i) = 0;
243 v1.hostToDevice<0,1,2>(v1.
size()-1,v1.
size()-1);
245 v1.deviceToHost<0,1,2>();
247 for (
size_t i = 0 ; i < v1.
size() ; i++)
249 BOOST_REQUIRE_EQUAL(v1.template get<0>(i),i);
250 BOOST_REQUIRE_EQUAL(v1.template get<1>(i),i+300);
251 BOOST_REQUIRE_EQUAL(v1.template get<2>(i),i+6123.0);
255 BOOST_AUTO_TEST_CASE( vector_cuda_host_to_device_check_NUMA )
261 for (
size_t i = 0 ; i < v1.
size() ; i++)
263 v1.template get<0>(i) = i;
264 v1.template get<1>(i) = i+300;
265 v1.template get<2>(i) = i+6123.0;
268 v1.hostToDeviceNUMA<0,1,2>();
272 for (
size_t i = 0 ; i < v1.
size()-1 ; i++)
274 v1.template get<0>(i) = 0;
275 v1.template get<1>(i) = 0;
276 v1.template get<2>(i) = 0;
279 v1.hostToDeviceNUMA<0,1,2>(v1.
size()-1,v1.
size()-1);
281 v1.deviceToHost<0,1,2>();
283 for (
size_t i = 0 ; i < v1.
size() ; i++)
285 BOOST_REQUIRE_EQUAL(v1.template get<0>(i),i);
286 BOOST_REQUIRE_EQUAL(v1.template get<1>(i),i+300);
287 BOOST_REQUIRE_EQUAL(v1.template get<2>(i),i+6123.0);
291 BOOST_AUTO_TEST_CASE( vector_cuda_host_to_device_vector_and_point_tensor )
297 for (
size_t i = 0 ; i < 50 ; i++)
299 v1.template get<0>(i)[0] = i+1500;
300 v1.template get<0>(i)[1] = i+2200;
301 v1.template get<0>(i)[2] = i+2600;
303 v1.template get<1>(i)[0][0] = i+6000;
304 v1.template get<1>(i)[0][1] = i+7200;
305 v1.template get<1>(i)[0][2] = i+8600;
306 v1.template get<1>(i)[1][0] = i+9000;
307 v1.template get<1>(i)[1][1] = i+10200;
308 v1.template get<1>(i)[1][2] = i+11600;
309 v1.template get<1>(i)[2][0] = i+12800;
310 v1.template get<1>(i)[2][1] = i+22200;
311 v1.template get<1>(i)[2][2] = i+23600;
314 v1.hostToDevice<0,1>(0,50);
316 for (
size_t i = 50 ; i < 100 ; i++)
318 v1.template get<0>(i)[0] = i+1500;
319 v1.template get<0>(i)[1] = i+2200;
320 v1.template get<0>(i)[2] = i+2600;
322 v1.template get<1>(i)[0][0] = i+6000;
323 v1.template get<1>(i)[0][1] = i+7200;
324 v1.template get<1>(i)[0][2] = i+8600;
325 v1.template get<1>(i)[1][0] = i+9000;
326 v1.template get<1>(i)[1][1] = i+10200;
327 v1.template get<1>(i)[1][2] = i+11600;
328 v1.template get<1>(i)[2][0] = i+12800;
329 v1.template get<1>(i)[2][1] = i+22200;
330 v1.template get<1>(i)[2][2] = i+23600;
333 v1.hostToDevice<0,1>(50,99);
335 v1.deviceToHost<0,1>();
337 for (
size_t i = 0 ; i < 100 ; i++)
339 BOOST_REQUIRE_EQUAL(v1.template get<0>(i)[0],i+1500);
340 BOOST_REQUIRE_EQUAL(v1.template get<0>(i)[1],i+2200);
341 BOOST_REQUIRE_EQUAL(v1.template get<0>(i)[2],i+2600);
343 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[0][0],i+6000);
344 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[0][1],i+7200);
345 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[0][2],i+8600);
346 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[1][0],i+9000);
347 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[1][1],i+10200);
348 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[1][2],i+11600);
349 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[2][0],i+12800);
350 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[2][1],i+22200);
351 BOOST_REQUIRE_EQUAL(v1.template get<1>(i)[2][2],i+23600);
355 BOOST_AUTO_TEST_CASE( vector_cuda_copy )
362 auto ite = v1.getIterator();
368 v1.template get<0>(p) = p + 100;
370 v1.template get<0>(p) = p + 2000;
371 v1.template get<0>(p) = p + 3000;
372 v1.template get<0>(p) = p + 4000;
374 v1.template get<1>(p)[0] = p + 5000;
375 v1.template get<1>(p)[1] = p + 6000;
376 v1.template get<1>(p)[2] = p + 7000;
378 v1.template get<2>(p)[0][0] = p + 8000;
379 v1.template get<2>(p)[0][1] = p + 9000;
380 v1.template get<2>(p)[0][2] = p + 10000;
382 v1.template get<2>(p)[1][0] = p + 11000;
383 v1.template get<2>(p)[1][1] = p + 12000;
384 v1.template get<2>(p)[2][2] = p + 13000;
386 v1.template get<2>(p)[2][0] = p + 14000;
387 v1.template get<2>(p)[2][1] = p + 15000;
388 v1.template get<2>(p)[2][2] = p + 16000;
393 v1.hostToDevice<0,1,2>();
395 ite = v1.getIterator();
401 v1.template get<0>(p) = p + 6100;
403 v1.template get<0>(p) = p + 62000;
404 v1.template get<0>(p) = p + 63000;
405 v1.template get<0>(p) = p + 64000;
407 v1.template get<1>(p)[0] = p + 65000;
408 v1.template get<1>(p)[1] = p + 66000;
409 v1.template get<1>(p)[2] = p + 67000;
411 v1.template get<2>(p)[0][0] = p + 68000;
412 v1.template get<2>(p)[0][1] = p + 69000;
413 v1.template get<2>(p)[0][2] = p + 610000;
415 v1.template get<2>(p)[1][0] = p + 611000;
416 v1.template get<2>(p)[1][1] = p + 612000;
417 v1.template get<2>(p)[2][2] = p + 613000;
419 v1.template get<2>(p)[2][0] = p + 614000;
420 v1.template get<2>(p)[2][1] = p + 615000;
421 v1.template get<2>(p)[2][2] = p + 616000;
432 ite = v2.getIterator();
438 match = v2.template get<0>(p) == p + 6100;
440 match = v2.template get<0>(p) == p + 62000;
441 match = v2.template get<0>(p) == p + 63000;
442 match = v2.template get<0>(p) == p + 64000;
444 match = v2.template get<1>(p)[0] == p + 65000;
445 match = v2.template get<1>(p)[1] == p + 66000;
446 match = v2.template get<1>(p)[2] == p + 67000;
448 match = v2.template get<2>(p)[0][0] == p + 68000;
449 match = v2.template get<2>(p)[0][1] == p + 69000;
450 match = v2.template get<2>(p)[0][2] == p + 610000;
452 match = v2.template get<2>(p)[1][0] == p + 611000;
453 match = v2.template get<2>(p)[1][1] == p + 612000;
454 match = v2.template get<2>(p)[2][2] == p + 613000;
456 match = v2.template get<2>(p)[2][0] == p + 614000;
457 match = v2.template get<2>(p)[2][1] == p + 615000;
458 match = v2.template get<2>(p)[2][2] == p + 616000;
463 BOOST_REQUIRE_EQUAL(match,
true);
465 v2.deviceToHost<0,1,2>();
467 ite = v2.getIterator();
473 match = v2.template get<0>(p) == p + 100;
475 match = v2.template get<0>(p) == p + 2000;
476 match = v2.template get<0>(p) == p + 3000;
477 match = v2.template get<0>(p) == p + 4000;
479 match = v2.template get<1>(p)[0] == p + 5000;
480 match = v2.template get<1>(p)[1] == p + 6000;
481 match = v2.template get<1>(p)[2] == p + 7000;
483 match = v2.template get<2>(p)[0][0] == p + 8000;
484 match = v2.template get<2>(p)[0][1] == p + 9000;
485 match = v2.template get<2>(p)[0][2] == p + 10000;
487 match = v2.template get<2>(p)[1][0] == p + 11000;
488 match = v2.template get<2>(p)[1][1] == p + 12000;
489 match = v2.template get<2>(p)[2][2] == p + 13000;
491 match = v2.template get<2>(p)[2][0] == p + 14000;
492 match = v2.template get<2>(p)[2][1] == p + 15000;
493 match = v2.template get<2>(p)[2][2] == p + 16000;
497 std::cout << v2.template get<0>(p) << std::endl;
503 BOOST_REQUIRE_EQUAL(match,
true);
506 BOOST_AUTO_TEST_SUITE_END()
This class allocate, and destroy CPU memory.
Grow policy define how the vector should grow every time we exceed the size.
Implementation of 1-D std::vector like structure.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Transform the boost::fusion::vector into memory specification (memory_traits)