diff --git a/c_api/src/c_api_test_utils.cpp b/c_api/src/c_api_test_utils.cpp new file mode 100644 index 0000000000000..2e30a16ea40ba --- /dev/null +++ b/c_api/src/c_api_test_utils.cpp @@ -0,0 +1,24 @@ +#include "c_api_test_utils.h" +#include "taichi/platform/cuda/detect_cuda.h" + +#ifdef TI_WITH_VULKAN +#include "taichi/rhi/vulkan/vulkan_loader.h" +#endif + +namespace capi { +namespace utils { + +bool is_vulkan_available() { +#ifdef TI_WITH_VULKAN + return taichi::lang::vulkan::is_vulkan_api_available(); +#else + return false; +#endif +} + +bool is_cuda_available() { + return taichi::is_cuda_api_available(); +} + +} // namespace utils +} // namespace capi diff --git a/c_api/src/c_api_test_utils.h b/c_api/src/c_api_test_utils.h new file mode 100644 index 0000000000000..13f91666580fe --- /dev/null +++ b/c_api/src/c_api_test_utils.h @@ -0,0 +1,11 @@ +#pragma once +#include + +namespace capi { +namespace utils { + +TI_DLL_EXPORT bool TI_API_CALL is_vulkan_available(); +TI_DLL_EXPORT bool TI_API_CALL is_cuda_available(); + +} // namespace utils +} // namespace capi diff --git a/c_api/tests/c_api_interface_test.cpp b/c_api/tests/c_api_interface_test.cpp index d43d661a091c8..683b6569bfb2b 100644 --- a/c_api/tests/c_api_interface_test.cpp +++ b/c_api/tests/c_api_interface_test.cpp @@ -1,4 +1,5 @@ #include "gtest/gtest.h" +#include "c_api_test_utils.h" #include "taichi/taichi_core.h" TEST(CapiDryRun, Runtime) { @@ -8,6 +9,20 @@ TEST(CapiDryRun, Runtime) { TiRuntime runtime = ti_create_runtime(arch); ti_destroy_runtime(runtime); } + + if (capi::utils::is_vulkan_available()) { + // Vulkan Runtime + TiArch arch = TiArch::TI_ARCH_VULKAN; + TiRuntime runtime = ti_create_runtime(arch); + ti_destroy_runtime(runtime); + } + + if (capi::utils::is_cuda_available()) { + // Vulkan Runtime + TiArch arch = TiArch::TI_ARCH_CUDA; + TiRuntime runtime = ti_create_runtime(arch); + ti_destroy_runtime(runtime); + } } TEST(CapiDryRun, MemoryAllocation) { @@ -30,6 +45,28 @@ TEST(CapiDryRun, MemoryAllocation) { ti_destroy_runtime(runtime); } + + if (capi::utils::is_vulkan_available()) { + // Vulkan Runtime + TiArch arch = TiArch::TI_ARCH_VULKAN; + TiRuntime runtime = ti_create_runtime(arch); + + TiMemory memory = ti_allocate_memory(runtime, &alloc_info); + ti_free_memory(runtime, memory); + + ti_destroy_runtime(runtime); + } + + if (capi::utils::is_cuda_available()) { + // Cuda Runtime + TiArch arch = TiArch::TI_ARCH_CUDA; + TiRuntime runtime = ti_create_runtime(arch); + + TiMemory memory = ti_allocate_memory(runtime, &alloc_info); + ti_free_memory(runtime, memory); + + ti_destroy_runtime(runtime); + } } TEST(CapiDryRun, CpuAotModule) { @@ -49,3 +86,45 @@ TEST(CapiDryRun, CpuAotModule) { ti_destroy_runtime(runtime); } } + +TEST(CapiDryRun, VulkanAotModule) { + if (capi::utils::is_vulkan_available()) { + const auto folder_dir = getenv("TAICHI_AOT_FOLDER_PATH"); + + std::stringstream aot_mod_ss; + aot_mod_ss << folder_dir; + + { + // Vulkan Runtime + TiArch arch = TiArch::TI_ARCH_VULKAN; + TiRuntime runtime = ti_create_runtime(arch); + + TiAotModule aot_mod = + ti_load_aot_module(runtime, aot_mod_ss.str().c_str()); + ti_destroy_aot_module(aot_mod); + + ti_destroy_runtime(runtime); + } + } +} + +TEST(CapiDryRun, CudaAotModule) { + if (capi::utils::is_cuda_available()) { + const auto folder_dir = getenv("TAICHI_AOT_FOLDER_PATH"); + + std::stringstream aot_mod_ss; + aot_mod_ss << folder_dir; + + { + // Vulkan Runtime + TiArch arch = TiArch::TI_ARCH_CUDA; + TiRuntime runtime = ti_create_runtime(arch); + + TiAotModule aot_mod = + ti_load_aot_module(runtime, aot_mod_ss.str().c_str()); + ti_destroy_aot_module(aot_mod); + + ti_destroy_runtime(runtime); + } + } +} diff --git a/cmake/TaichiCAPI.cmake b/cmake/TaichiCAPI.cmake index 8a882e2e82629..127b7be4da10b 100644 --- a/cmake/TaichiCAPI.cmake +++ b/cmake/TaichiCAPI.cmake @@ -3,6 +3,10 @@ cmake_minimum_required(VERSION 3.0) set(TAICHI_C_API_NAME taichi_c_api) file(GLOB_RECURSE C_API_SOURCE "c_api/src/*.cpp") +if(NOT TI_BUILD_TESTS) + list(REMOVE_ITEM C_API_SOURCE "c_api/src/c_api_test_utils.cpp") +endif() + add_library(${TAICHI_C_API_NAME} SHARED ${C_API_SOURCE}) target_link_libraries(${TAICHI_C_API_NAME} PRIVATE taichi_isolated_core) diff --git a/cmake/TaichiCAPITests.cmake b/cmake/TaichiCAPITests.cmake index 49d7e43f3ba62..832c55c4d1ab1 100644 --- a/cmake/TaichiCAPITests.cmake +++ b/cmake/TaichiCAPITests.cmake @@ -22,6 +22,7 @@ target_include_directories(${C_API_TESTS_NAME} PRIVATE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/c_api/include + ${PROJECT_SOURCE_DIR}/c_api/src ) add_test(NAME ${C_API_TESTS_NAME} COMMAND ${C_API_TESTS_NAME}) diff --git a/tests/cpp/aot/llvm/kernel_aot_test.py b/tests/cpp/aot/llvm/kernel_aot_test.py index dda556d662678..d4bb27a9ea333 100644 --- a/tests/cpp/aot/llvm/kernel_aot_test.py +++ b/tests/cpp/aot/llvm/kernel_aot_test.py @@ -13,5 +13,7 @@ compile_kernel_aot(arch=ti.cpu) elif args.arch == "cuda": compile_kernel_aot(arch=ti.cuda) + elif args.arch == "vulkan": + compile_kernel_aot(arch=ti.vulkan) else: assert False diff --git a/tests/test_utils.py b/tests/test_utils.py index 8522288ece0e6..c6fd5432da96c 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -36,6 +36,12 @@ __capi_aot_test_cases = { "CapiDryRun.CpuAotModule": [os.path.join('cpp', 'aot', 'llvm', 'kernel_aot_test.py'), "--arch=cpu"], + "CapiDryRun.VulkanAotModule": [ + os.path.join('cpp', 'aot', 'llvm', 'kernel_aot_test.py'), + "--arch=vulkan" + ], + "CapiDryRun.CudaAotModule": + [os.path.join('cpp', 'aot', 'llvm', 'kernel_aot_test.py'), "--arch=cuda"], }