1+ // REQUIRES: aspect-ext_oneapi_virtual_mem
2+
3+ // RUN: %{build} -o %t.out
4+ // RUN: %{run} %t.out
5+
6+ #include < sycl/ext/oneapi/experimental/device_architecture.hpp>
7+ #include < sycl/ext/oneapi/virtual_mem/physical_mem.hpp>
8+ #include < sycl/ext/oneapi/virtual_mem/virtual_mem.hpp>
9+
10+ namespace syclext = sycl::ext::oneapi::experimental;
11+
12+ int main () {
13+ sycl::queue Q;
14+ sycl::context Context = Q.get_context ();
15+
16+ size_t UsedGranularityInBytes = syclext::get_mem_granularity (Context, syclext::granularity_mode::recommended);
17+
18+ syclext::physical_mem NewPhysicalMem{Q.get_device (), Context, UsedGranularityInBytes};
19+ uintptr_t VirtualMemoryPtr = syclext::reserve_virtual_mem (0 , UsedGranularityInBytes, Context);
20+
21+ void *MappedPtr = NewPhysicalMem.map (VirtualMemoryPtr, UsedGranularityInBytes, syclext::address_access_mode::read_write);
22+
23+ int * DataPtr = reinterpret_cast <int *>(MappedPtr);
24+
25+ sycl::range NumItems{UsedGranularityInBytes/sizeof (int )};
26+
27+ std::vector<int > ResultHostData (NumItems.size ());
28+
29+ constexpr int ExpectedValueAfterFill = 1 ;
30+
31+ Q.fill (DataPtr,ExpectedValueAfterFill , NumItems.size ()).wait_and_throw ();
32+ {
33+ sycl::buffer<int > CheckBuffer (ResultHostData);
34+ Q.submit ([&](auto &handle) {
35+ sycl::accessor A (CheckBuffer, handle, sycl::write_only);
36+ handle.parallel_for (NumItems, [=](auto i) { A[i] = DataPtr[i]; });
37+ });
38+ }
39+
40+ for (size_t i = 0 ; i < ResultHostData.size (); i++) {
41+ if (ResultHostData[i] != ExpectedValueAfterFill) {
42+ std::cout << " Comparison failed after fill operation at index " << i << " : " << ResultHostData[i]
43+ << " != " <<ExpectedValueAfterFill << std::endl;
44+ return 1 ;
45+ }
46+ }
47+
48+ Q.submit ([&](auto &handle) {
49+ handle.parallel_for (NumItems, [=](auto i) {
50+ DataPtr[i] = i;
51+ });
52+ }).wait_and_throw ();
53+
54+ syclext::set_access_mode (DataPtr,UsedGranularityInBytes, syclext::address_access_mode::read, Context);
55+
56+
57+ {
58+ sycl::buffer<int > ResultBuffer (ResultHostData);
59+
60+ Q.submit ([&](auto &handle) {
61+ sycl::accessor A (ResultBuffer, handle, sycl::write_only);
62+ handle.parallel_for (NumItems, [=](auto i) { A[i] = DataPtr[i]; });
63+ });
64+ }
65+
66+ for (size_t i = 0 ; i < NumItems.size (); i++) {
67+ const int ExpectedValue = static_cast <int >(i);
68+ if (ResultHostData[i] != ExpectedValue) {
69+ std::cout << " Comparison failed at index " << i << " : " << ResultHostData[i]
70+ << " != " << ExpectedValue<< std::endl;
71+ return 1 ;
72+ }
73+ }
74+
75+ syclext::unmap (MappedPtr, UsedGranularityInBytes, Context);
76+ syclext::free_virtual_mem (VirtualMemoryPtr, UsedGranularityInBytes, Context);
77+
78+ return 0 ;
79+ }
0 commit comments