Skip to content

Commit 688c301

Browse files
KarachunIvanbader
authored andcommitted
[SYCL] Fix implementation of CG::FILL with offset
Fixed piEnqueueMemBufferFill call as OpenCL API requires offset specified in bytes, not in elements. Signed-off-by: KarachunIvan <[email protected]>
1 parent bec3c74 commit 688c301

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

sycl/source/detail/memory_manager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ void MemoryManager::fill(SYCLMemObjI *SYCLMemObj, void *Mem, QueueImplPtr Queue,
378378
if (Dim == 1) {
379379
PI_CALL(RT::piEnqueueMemBufferFill(
380380
Queue->getHandleRef(), pi::pi_cast<RT::PiMem>(Mem), Pattern,
381-
PatternSize, Offset[0], Range[0] * ElementSize, DepEvents.size(),
382-
&DepEvents[0], &OutEvent));
381+
PatternSize, Offset[0] * ElementSize, Range[0] * ElementSize,
382+
DepEvents.size(), &DepEvents[0], &OutEvent));
383383
return;
384384
}
385385
assert(!"Not supported configuration of fill requested");

sycl/test/basic_tests/buffer/buffer_full_copy.cpp

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// RUN: %clang -std=c++11 %s -o %t1.out -lstdc++ -lOpenCL -lsycl
1+
// RUN: %clangxx %s -o %t1.out -lOpenCL -lsycl
22
// RUN: env SYCL_DEVICE_TYPE=HOST %t1.out
3-
// RUN: %clang -std=c++11 -fsycl %s -o %t2.out -lstdc++ -lOpenCL -lsycl
3+
// RUN: %clangxx -fsycl %s -o %t2.out -lOpenCL
44
// RUN: env SYCL_DEVICE_TYPE=HOST %t2.out
55
// RUN: %CPU_RUN_PLACEHOLDER %t2.out
66
// RUN: %GPU_RUN_PLACEHOLDER %t2.out
@@ -54,6 +54,36 @@ void check_copy_device_to_host(cl::sycl::queue &Queue) {
5454
}
5555
}
5656

57+
void check_fill(cl::sycl::queue &Queue) {
58+
const int size = 6, offset = 2;
59+
cl::sycl::buffer<float, 1> buf_1(size);
60+
cl::sycl::buffer<float, 1> buf_2(size / 2);
61+
std::vector<float> expected_res_1(size);
62+
std::vector<float> expected_res_2(size / 2);
63+
64+
// fill with offset
65+
{
66+
auto acc = buf_1.get_access<cl::sycl::access::mode::write>();
67+
for (int i = 0; i < size; ++i) {
68+
acc[i] = i + 1;
69+
expected_res_1[i] = offset <= i && i < size / 2 + offset ? 1337.0 : i + 1;
70+
}
71+
}
72+
73+
auto e = Queue.submit([&](cl::sycl::handler &cgh) {
74+
auto a = buf_1.template get_access<cl::sycl::access::mode::write>(
75+
cgh, size / 2, offset);
76+
cgh.fill(a, (float)1337.0);
77+
});
78+
e.wait();
79+
80+
{
81+
auto acc_1 = buf_1.get_access<cl::sycl::access::mode::read>();
82+
for (int i = 0; i < size; ++i)
83+
assert(expected_res_1[i] == acc_1[i]);
84+
}
85+
}
86+
5787
void check_copy_host_to_device(cl::sycl::queue &Queue) {
5888
const int size = 6, offset = 2;
5989
cl::sycl::buffer<float, 1> buf_1(size);
@@ -144,6 +174,7 @@ int main() {
144174
cl::sycl::queue Queue;
145175
check_copy_host_to_device(Queue);
146176
check_copy_device_to_host(Queue);
177+
check_fill(Queue);
147178
} catch (cl::sycl::exception &ex) {
148179
std::cerr << ex.what() << std::endl;
149180
}

0 commit comments

Comments
 (0)