mirror-llvm-project/libsycl/unittests/queue/memcpy.cpp
2026-07-07 11:29:57 +02:00

85 lines
2.8 KiB
C++

#include <mock/helpers.hpp>
#include <sycl/__impl/device.hpp>
#include <sycl/__impl/queue.hpp>
#include <detail/device_impl.hpp>
#include <detail/queue_impl.hpp>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace sycl;
using namespace ::testing;
TEST(Queue, Memcpy) {
constexpr int NumBytes = 32;
constexpr int NMemcpies = 4;
constexpr int NMemcpyAttempts = 5;
mock::MockWrapper Mock;
queue Q;
bool IsSrcHostPtr = false;
bool IsDstHostPtr = false;
int *SrcPtr = reinterpret_cast<int *>(1);
int *DstPtr = reinterpret_cast<int *>(2);
ol_device_handle_t OLDev =
detail::getSyclObjImpl(Q.get_device())->getOLHandle();
EXPECT_CALL(Mock.get(), olGetMemInfo(_, OL_MEM_INFO_DEVICE,
sizeof(ol_device_handle_t), _))
.Times(NMemcpyAttempts * 2)
.WillRepeatedly([&](const void *Ptr, ol_mem_info_t PropName,
size_t PropSize, void *PropValue) -> ol_result_t {
EXPECT_TRUE(Ptr == SrcPtr || Ptr == DstPtr);
bool IsHostPtr = Ptr == SrcPtr ? IsSrcHostPtr : IsDstHostPtr;
if (IsHostPtr)
return mock::getMockLiboffload().makeEmptyStrError(OL_ERRC_NOT_FOUND);
*(static_cast<ol_device_handle_t *>(PropValue)) = OLDev;
return OL_SUCCESS;
});
EXPECT_CALL(Mock.get(), olMemcpy(_, DstPtr, _, SrcPtr, _, NumBytes))
.Times(NMemcpies)
.WillRepeatedly([&](ol_queue_handle_t Queue, void *DstPtr,
ol_device_handle_t DstDevice, const void *SrcPtr,
ol_device_handle_t SrcDevice,
size_t Size) -> ol_result_t {
EXPECT_NE(Queue, nullptr);
ol_device_handle_t HostDevice =
mock::getMockLiboffload().getHostOLDevice();
EXPECT_EQ(DstDevice, IsDstHostPtr ? HostDevice : OLDev);
EXPECT_EQ(SrcDevice, IsSrcHostPtr ? HostDevice : OLDev);
return OL_SUCCESS;
});
EXPECT_CALL(Mock.get(), olCreateEvent(_, _, _)).Times(NMemcpies);
event Event = Q.memcpy(DstPtr, SrcPtr, NumBytes);
EXPECT_CALL(Mock.get(), olWaitEvents(_, _, 1));
Q.memcpy(DstPtr, SrcPtr, NumBytes, Event);
IsSrcHostPtr = true;
Q.memcpy(DstPtr, SrcPtr, NumBytes);
IsSrcHostPtr = false;
IsDstHostPtr = true;
Q.memcpy(DstPtr, SrcPtr, NumBytes);
IsSrcHostPtr = true;
try {
Q.memcpy(DstPtr, SrcPtr, NumBytes);
} catch (const exception &e) {
EXPECT_EQ(e.code(), make_error_code(errc::feature_not_supported));
}
}
TEST(Queue, MemcpyZeroBytes) {
mock::MockWrapper Mock;
queue Q;
EXPECT_CALL(Mock.get(), olWaitEvents(_, _, 1)).Times(1);
EXPECT_CALL(Mock.get(), olGetMemInfo(_, _, _, _)).Times(0);
EXPECT_CALL(Mock.get(), olMemcpy(_, _, _, _, _, _)).Times(0);
event Event = Q.memcpy(nullptr, nullptr, 0);
Q.memcpy(nullptr, nullptr, 0, Event);
}