#include "omptarget.h"
#include "gtest/gtest.h"
#include <unordered_set>
const int DEVICE_ID = 0;
std::unordered_set<int> setup_map;
int init_test_device(int ID) {
if (setup_map.find(ID) != setup_map.end()) {
return OFFLOAD_SUCCESS;
}
if (__tgt_rtl_init_plugin() == OFFLOAD_FAIL ||
__tgt_rtl_init_device(ID) == OFFLOAD_FAIL) {
return OFFLOAD_FAIL;
}
setup_map.insert(ID);
return OFFLOAD_SUCCESS;
}
TEST(NextgenPluginsTest, PluginInit) {
EXPECT_EQ(OFFLOAD_SUCCESS, init_test_device(DEVICE_ID));
}
TEST(NextgenPluginsTest, PluginAlloc) {
int32_t test_value = 23;
int32_t host_value = -1;
int64_t var_size = sizeof(int32_t);
EXPECT_EQ(OFFLOAD_SUCCESS, init_test_device(DEVICE_ID));
void *device_ptr =
__tgt_rtl_data_alloc(DEVICE_ID, var_size, nullptr, TARGET_ALLOC_DEFAULT);
EXPECT_NE(device_ptr, nullptr);
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_submit(DEVICE_ID, device_ptr,
&test_value, var_size));
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_retrieve(DEVICE_ID, &host_value,
device_ptr, var_size));
EXPECT_EQ(host_value, test_value);
EXPECT_EQ(OFFLOAD_SUCCESS,
__tgt_rtl_data_delete(DEVICE_ID, device_ptr, TARGET_ALLOC_DEFAULT));
}
TEST(NextgenPluginsTest, PluginAsyncAlloc) {
int32_t test_value = 47;
int32_t host_value = -1;
int64_t var_size = sizeof(int32_t);
__tgt_async_info *info;
EXPECT_EQ(OFFLOAD_SUCCESS, init_test_device(DEVICE_ID));
if (__tgt_rtl_init_async_info(DEVICE_ID, &info) == OFFLOAD_SUCCESS) {
void *device_ptr = __tgt_rtl_data_alloc(DEVICE_ID, var_size, nullptr,
TARGET_ALLOC_DEFAULT);
EXPECT_NE(device_ptr, nullptr);
EXPECT_EQ(OFFLOAD_SUCCESS,
__tgt_rtl_data_submit_async(DEVICE_ID, device_ptr, &test_value,
var_size, info));
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_synchronize(DEVICE_ID, info));
EXPECT_EQ(OFFLOAD_SUCCESS,
__tgt_rtl_data_retrieve_async(DEVICE_ID, &host_value, device_ptr,
var_size, info));
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_synchronize(DEVICE_ID, info));
EXPECT_EQ(host_value, test_value);
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_delete(DEVICE_ID, device_ptr,
TARGET_ALLOC_DEFAULT));
}
}
TEST(NextgenPluginsTest, PluginDataSwap) {
int32_t test_value = 23;
int32_t host_value = -1;
int64_t var_size = sizeof(int32_t);
int DEVICE_TWO = -1;
for (int i = 1; i < __tgt_rtl_number_of_devices(); i++) {
if (__tgt_rtl_is_data_exchangable(DEVICE_ID, i)) {
DEVICE_TWO = i;
break;
}
}
if (DEVICE_TWO >= 1) {
EXPECT_EQ(OFFLOAD_SUCCESS, init_test_device(DEVICE_ID));
EXPECT_EQ(OFFLOAD_SUCCESS, init_test_device(DEVICE_TWO));
void *source_ptr = __tgt_rtl_data_alloc(DEVICE_ID, var_size, nullptr,
TARGET_ALLOC_DEFAULT);
void *dest_ptr = __tgt_rtl_data_alloc(DEVICE_TWO, var_size, nullptr,
TARGET_ALLOC_DEFAULT);
EXPECT_NE(source_ptr, nullptr);
EXPECT_NE(dest_ptr, nullptr);
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_submit(DEVICE_ID, source_ptr,
&test_value, var_size));
EXPECT_EQ(OFFLOAD_SUCCESS,
__tgt_rtl_data_exchange(DEVICE_ID, source_ptr, DEVICE_TWO,
dest_ptr, var_size));
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_retrieve(DEVICE_TWO, &host_value,
dest_ptr, var_size));
EXPECT_EQ(host_value, test_value);
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_delete(DEVICE_ID, source_ptr,
TARGET_ALLOC_DEFAULT));
EXPECT_EQ(OFFLOAD_SUCCESS, __tgt_rtl_data_delete(DEVICE_TWO, dest_ptr,
TARGET_ALLOC_DEFAULT));
}
}