[llvm] [libsycl] USM Aligned allocation functions (PR #213468)
Kseniya Tikhomirova via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 8 04:50:08 PDT 2026
================
@@ -0,0 +1,238 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <mock/helpers.hpp>
+
+#include <sycl/__impl/device.hpp>
+#include <sycl/__impl/queue.hpp>
+#include <sycl/__impl/usm_functions.hpp>
+
+#include <detail/device_impl.hpp>
+#include <detail/queue_impl.hpp>
+
+#include <cstddef>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace sycl;
+using namespace ::testing;
+
+constexpr size_t NumBytes = 1024;
+constexpr size_t Alignment = 256;
+
+TEST(USMFunctions, DeviceAllocation) {
+ mock::MockWrapper Mock;
+ queue Q;
+ device Dev = Q.get_device();
+ context Ctx = Q.get_context();
+ ol_device_handle_t OLDev = detail::getSyclObjImpl(Dev)->getOLHandle();
+
+ EXPECT_CALL(Mock.get(), olMemAlloc(OLDev, OL_ALLOC_TYPE_DEVICE, NumBytes, _))
+ .Times(1);
+ void *Ptr1 = malloc_device(NumBytes, Dev, Ctx);
+ EXPECT_NE(Ptr1, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr1)).Times(1);
+ free(Ptr1, Ctx);
+
+ EXPECT_CALL(Mock.get(), olMemAllocAligned(OLDev, OL_ALLOC_TYPE_DEVICE,
+ NumBytes, Alignment, _))
+ .Times(1);
+ void *Ptr2 = aligned_alloc_device(Alignment, NumBytes, Q);
+ EXPECT_NE(Ptr2, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr2)).Times(1);
+ free(Ptr2, Q);
+}
+
+TEST(USMFunctions, HostAllocation) {
+ mock::MockWrapper Mock;
+ queue Q;
+ context Ctx = Q.get_context();
+ ol_device_handle_t OLDev =
+ detail::getSyclObjImpl(Q.get_device())->getOLHandle();
+
+ EXPECT_CALL(Mock.get(), olMemAllocHost(OLDev, NumBytes, _)).Times(1);
+ void *Ptr1 = malloc_host(NumBytes, Ctx);
+ EXPECT_NE(Ptr1, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr1)).Times(1);
+ free(Ptr1, Ctx);
+
+ EXPECT_CALL(Mock.get(), olMemAllocAlignedHost(OLDev, NumBytes, Alignment, _))
+ .Times(1);
+ void *Ptr2 = aligned_alloc_host(Alignment, NumBytes, Ctx);
+ EXPECT_NE(Ptr2, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr2)).Times(1);
+ free(Ptr2, Ctx);
+}
+
+TEST(USMFunctions, SharedAllocation) {
+ mock::MockWrapper Mock;
+ queue Q;
+ device Dev = Q.get_device();
+ context Ctx = Q.get_context();
+ ol_device_handle_t OLDev = detail::getSyclObjImpl(Dev)->getOLHandle();
+
+ EXPECT_CALL(Mock.get(), olMemAlloc(OLDev, OL_ALLOC_TYPE_MANAGED, NumBytes, _))
+ .Times(1);
+ void *Ptr1 = malloc_shared(NumBytes, Dev, Ctx);
+ EXPECT_NE(Ptr1, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr1)).Times(1);
+ free(Ptr1, Ctx);
+
+ EXPECT_CALL(Mock.get(), olMemAllocAligned(OLDev, OL_ALLOC_TYPE_MANAGED,
+ NumBytes, Alignment, _))
+ .Times(1);
+ void *Ptr2 = aligned_alloc_shared(Alignment, NumBytes, Q);
+ EXPECT_NE(Ptr2, nullptr);
+
+ EXPECT_CALL(Mock.get(), olMemFree(Ptr2)).Times(1);
+ free(Ptr2, Q);
+}
+
+TEST(USMFunctions, ZeroByteAllocation) {
+ mock::MockWrapper Mock;
+ queue Q;
+ device Dev = Q.get_device();
+ context Ctx = Q.get_context();
+
+ EXPECT_CALL(Mock.get(), olMemAlloc(_, _, _, _)).Times(0);
+ EXPECT_CALL(Mock.get(), olMemAllocHost(_, _, _)).Times(0);
+ EXPECT_CALL(Mock.get(), olMemAllocAligned(_, _, _, _, _)).Times(0);
+ EXPECT_CALL(Mock.get(), olMemAllocAlignedHost(_, _, _, _)).Times(0);
+
+ EXPECT_EQ(malloc_device(0, Dev, Ctx), nullptr);
+ EXPECT_EQ(malloc_shared(0, Dev, Ctx), nullptr);
+ EXPECT_EQ(malloc_host(0, Ctx), nullptr);
+}
+
+TEST(USMFunctions, InvalidAlignment) {
+ mock::MockWrapper Mock;
+ queue Q;
+ device Dev = Q.get_device();
+ context Ctx = Q.get_context();
+ ol_device_handle_t OLDev = detail::getSyclObjImpl(Dev)->getOLHandle();
+
+ constexpr size_t NonPowerOf2Alignment = 3;
+
+ EXPECT_CALL(Mock.get(), olMemAllocAligned(OLDev, OL_ALLOC_TYPE_DEVICE,
+ NumBytes, NonPowerOf2Alignment, _))
+ .Times(1)
+ .WillOnce(Return(mock::getMockLiboffload().makeEmptyStrError(
+ OL_ERRC_INVALID_ARGUMENT)));
+ EXPECT_EQ(aligned_alloc_device(NonPowerOf2Alignment, NumBytes, Dev, Ctx),
+ nullptr);
+
+ EXPECT_CALL(Mock.get(),
+ olMemAllocAlignedHost(OLDev, NumBytes, NonPowerOf2Alignment, _))
+ .Times(1)
+ .WillOnce(Return(mock::getMockLiboffload().makeEmptyStrError(
----------------
KseniyaTikhomirova wrote:
this overriding of default action can be removed once you fix my previous comment
https://github.com/llvm/llvm-project/pull/213468
More information about the llvm-commits
mailing list