mirror of
https://github.com/intel/llvm.git
synced 2026-01-14 03:50:17 +08:00
Introduced in OpenMP 6.0, the device UID shall be a unique identifier of a device on a given system. (Not necessarily a UUID.) Since it is not guaranteed that the (U)UIDs defined by the device vendor libraries, such as HSA, do not overlap with those of other vendors, the device UIDs in offload are always combined with the offload plugin name. In case the vendor library does not specify any device UID for a given device, we fall back to the offload-internal device ID. The device UID can be retrieved using the `llvm-offload-device-info` tool.
254 lines
11 KiB
C++
254 lines
11 KiB
C++
//===------- Offload API tests - olGetDeviceInfo --------------------------===//
|
|
//
|
|
// 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 "../common/Fixtures.hpp"
|
|
#include <OffloadAPI.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
using olGetDeviceInfoTest = OffloadDeviceTest;
|
|
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olGetDeviceInfoTest);
|
|
|
|
#define OL_DEVICE_INFO_TEST_SUCCESS_CHECK(TestName, PropType, PropName, Dev, \
|
|
Expr) \
|
|
TEST_P(olGetDeviceInfoTest, Test##Dev##TestName) { \
|
|
PropType Value; \
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Dev, PropName, sizeof(Value), &Value)); \
|
|
Expr; \
|
|
}
|
|
|
|
#define OL_DEVICE_INFO_TEST_DEVICE_SUCCESS(TestName, PropType, PropName) \
|
|
OL_DEVICE_INFO_TEST_SUCCESS_CHECK(TestName, PropType, PropName, Device, {})
|
|
|
|
#define OL_DEVICE_INFO_TEST_HOST_SUCCESS(TestName, PropType, PropName) \
|
|
OL_DEVICE_INFO_TEST_SUCCESS_CHECK(TestName, PropType, PropName, Host, {})
|
|
|
|
#define OL_DEVICE_INFO_TEST_SUCCESS(TestName, PropType, PropName) \
|
|
OL_DEVICE_INFO_TEST_DEVICE_SUCCESS(TestName, PropType, PropName) \
|
|
OL_DEVICE_INFO_TEST_HOST_SUCCESS(TestName, PropType, PropName)
|
|
|
|
#define OL_DEVICE_INFO_TEST_DEVICE_VALUE_GT(TestName, PropType, PropName, \
|
|
LowBound) \
|
|
OL_DEVICE_INFO_TEST_SUCCESS_CHECK(TestName, PropType, PropName, Device, \
|
|
ASSERT_GT(Value, LowBound))
|
|
|
|
#define OL_DEVICE_INFO_TEST_HOST_VALUE_GT(TestName, PropType, PropName, \
|
|
LowBound) \
|
|
OL_DEVICE_INFO_TEST_SUCCESS_CHECK(TestName, PropType, PropName, Host, \
|
|
ASSERT_GT(Value, LowBound))
|
|
|
|
#define OL_DEVICE_INFO_TEST_VALUE_GT(TestName, PropType, PropName, LowBound) \
|
|
OL_DEVICE_INFO_TEST_DEVICE_VALUE_GT(TestName, PropType, PropName, LowBound) \
|
|
OL_DEVICE_INFO_TEST_HOST_VALUE_GT(TestName, PropType, PropName, LowBound)
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessType) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Device, OL_DEVICE_INFO_TYPE,
|
|
sizeof(ol_device_type_t), &DeviceType));
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, HostSuccessType) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Host, OL_DEVICE_INFO_TYPE,
|
|
sizeof(ol_device_type_t), &DeviceType));
|
|
ASSERT_EQ(DeviceType, OL_DEVICE_TYPE_HOST);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessPlatform) {
|
|
ol_platform_handle_t Platform = nullptr;
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Device, OL_DEVICE_INFO_PLATFORM,
|
|
sizeof(ol_platform_handle_t), &Platform));
|
|
ASSERT_NE(Platform, nullptr);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessName) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Device, OL_DEVICE_INFO_NAME, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> Name;
|
|
Name.resize(Size);
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_NAME, Size, Name.data()));
|
|
ASSERT_EQ(std::strlen(Name.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, HostName) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Host, OL_DEVICE_INFO_NAME, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> Name;
|
|
Name.resize(Size);
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Host, OL_DEVICE_INFO_NAME, Size, Name.data()));
|
|
ASSERT_EQ(std::strlen(Name.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessProductName) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfoSize(Device, OL_DEVICE_INFO_PRODUCT_NAME, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> Name;
|
|
Name.resize(Size);
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_PRODUCT_NAME, Size, Name.data()));
|
|
ASSERT_EQ(std::strlen(Name.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessUID) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Device, OL_DEVICE_INFO_UID, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> UID;
|
|
UID.resize(Size);
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Device, OL_DEVICE_INFO_UID, Size, UID.data()));
|
|
ASSERT_EQ(std::strlen(UID.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, HostProductName) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Host, OL_DEVICE_INFO_PRODUCT_NAME, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> Name;
|
|
Name.resize(Size);
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfo(Host, OL_DEVICE_INFO_PRODUCT_NAME, Size, Name.data()));
|
|
ASSERT_EQ(std::strlen(Name.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, HostUID) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Host, OL_DEVICE_INFO_UID, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> UID;
|
|
UID.resize(Size);
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Host, OL_DEVICE_INFO_UID, Size, UID.data()));
|
|
ASSERT_EQ(std::strlen(UID.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessVendor) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(olGetDeviceInfoSize(Device, OL_DEVICE_INFO_VENDOR, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> Vendor;
|
|
Vendor.resize(Size);
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_VENDOR, Size, Vendor.data()));
|
|
ASSERT_EQ(std::strlen(Vendor.data()), Size - 1);
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessDriverVersion) {
|
|
size_t Size = 0;
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfoSize(Device, OL_DEVICE_INFO_DRIVER_VERSION, &Size));
|
|
ASSERT_GT(Size, 0ul);
|
|
std::vector<char> DriverVersion;
|
|
DriverVersion.resize(Size);
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Device, OL_DEVICE_INFO_DRIVER_VERSION, Size,
|
|
DriverVersion.data()));
|
|
ASSERT_EQ(std::strlen(DriverVersion.data()), Size - 1);
|
|
}
|
|
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(MaxWorkGroupSize, uint32_t,
|
|
OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE, 0);
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessMaxWorkGroupSizePerDimension) {
|
|
ol_dimensions_t Value{0, 0, 0};
|
|
ASSERT_SUCCESS(
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_MAX_WORK_GROUP_SIZE_PER_DIMENSION,
|
|
sizeof(Value), &Value));
|
|
ASSERT_GT(Value.x, 0u);
|
|
ASSERT_GT(Value.y, 0u);
|
|
ASSERT_GT(Value.z, 0u);
|
|
}
|
|
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(MaxWorkSize, uint32_t,
|
|
OL_DEVICE_INFO_MAX_WORK_SIZE, 0);
|
|
|
|
TEST_P(olGetDeviceInfoTest, SuccessMaxWorkSizePerDimension) {
|
|
ol_dimensions_t Value{0, 0, 0};
|
|
ASSERT_SUCCESS(olGetDeviceInfo(Device,
|
|
OL_DEVICE_INFO_MAX_WORK_SIZE_PER_DIMENSION,
|
|
sizeof(Value), &Value));
|
|
ASSERT_GT(Value.x, 0u);
|
|
ASSERT_GT(Value.y, 0u);
|
|
ASSERT_GT(Value.z, 0u);
|
|
}
|
|
|
|
OL_DEVICE_INFO_TEST_DEVICE_VALUE_GT(VendorId, uint32_t,
|
|
OL_DEVICE_INFO_VENDOR_ID, 0);
|
|
OL_DEVICE_INFO_TEST_HOST_SUCCESS(VendorId, uint32_t, OL_DEVICE_INFO_VENDOR_ID);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NumComputeUnits, uint32_t,
|
|
OL_DEVICE_INFO_NUM_COMPUTE_UNITS, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(SingleFPConfig, ol_device_fp_capability_flags_t,
|
|
OL_DEVICE_INFO_SINGLE_FP_CONFIG, 0);
|
|
OL_DEVICE_INFO_TEST_SUCCESS(HalfFPConfig, ol_device_fp_capability_flags_t,
|
|
OL_DEVICE_INFO_HALF_FP_CONFIG);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(DoubleFPConfig, ol_device_fp_capability_flags_t,
|
|
OL_DEVICE_INFO_DOUBLE_FP_CONFIG, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthChar, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_CHAR, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthShort, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_SHORT, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthInt, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_INT, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthLong, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_LONG, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthFloat, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_FLOAT, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(NativeVectorWidthDouble, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_DOUBLE, 0);
|
|
OL_DEVICE_INFO_TEST_SUCCESS(NativeVectorWidthHalf, uint32_t,
|
|
OL_DEVICE_INFO_NATIVE_VECTOR_WIDTH_HALF);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(MaxClockFrequency, uint32_t,
|
|
OL_DEVICE_INFO_MAX_CLOCK_FREQUENCY, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(MemoryClockRate, uint32_t,
|
|
OL_DEVICE_INFO_MEMORY_CLOCK_RATE, 0);
|
|
OL_DEVICE_INFO_TEST_VALUE_GT(AddressBits, uint32_t, OL_DEVICE_INFO_ADDRESS_BITS,
|
|
0);
|
|
OL_DEVICE_INFO_TEST_DEVICE_VALUE_GT(MaxMemAllocSize, uint64_t,
|
|
OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE, 0);
|
|
OL_DEVICE_INFO_TEST_HOST_SUCCESS(MaxMemAllocSize, uint64_t,
|
|
OL_DEVICE_INFO_MAX_MEM_ALLOC_SIZE);
|
|
OL_DEVICE_INFO_TEST_DEVICE_VALUE_GT(GlobalMemSize, uint64_t,
|
|
OL_DEVICE_INFO_GLOBAL_MEM_SIZE, 0);
|
|
OL_DEVICE_INFO_TEST_HOST_SUCCESS(GlobalMemSize, uint64_t,
|
|
OL_DEVICE_INFO_GLOBAL_MEM_SIZE);
|
|
|
|
TEST_P(olGetDeviceInfoTest, InvalidNullHandleDevice) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE,
|
|
olGetDeviceInfo(nullptr, OL_DEVICE_INFO_TYPE,
|
|
sizeof(ol_device_type_t), &DeviceType));
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, InvalidEnumerationInfoType) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_ERROR(OL_ERRC_INVALID_ENUMERATION,
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_FORCE_UINT32,
|
|
sizeof(ol_device_type_t), &DeviceType));
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, InvalidSizePropSize) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_ERROR(OL_ERRC_INVALID_SIZE,
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_TYPE, 0, &DeviceType));
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, InvalidSizePropSizeSmall) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_ERROR(OL_ERRC_INVALID_SIZE,
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_TYPE,
|
|
sizeof(DeviceType) - 1, &DeviceType));
|
|
}
|
|
|
|
TEST_P(olGetDeviceInfoTest, InvalidNullPointerPropValue) {
|
|
ol_device_type_t DeviceType;
|
|
ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER,
|
|
olGetDeviceInfo(Device, OL_DEVICE_INFO_TYPE, sizeof(DeviceType),
|
|
nullptr));
|
|
}
|