Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1164,13 +1164,20 @@ if(NOT BUILD_CPU_ONLY)
endblock()

include(cmake/modules/generate_cutile_kernels.cmake)
# cuTile can export sm_107 (Rubin) kernels only starting with CUDA 13.4. CUVS_CUTILE_SM107_ENABLED
# hides the sm_107 code paths in the older versions.
# Tile IR supports sm_103 starting with version 13.1 and sm_107 starting with 13.4. Conservatively
# gate by the CUDA compiler version, as in the existing sm_107 support.
set(CUVS_CUTILE_SM103_ENABLED 0)
set(CUVS_CUTILE_SM107_ENABLED 0)
set(CUVS_CUTILE_EXCLUDED_GPU_CODES "sm_107")
set(CUVS_CUTILE_EXCLUDED_GPU_CODES "")
if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1)
set(CUVS_CUTILE_SM103_ENABLED 1)
else()
list(APPEND CUVS_CUTILE_EXCLUDED_GPU_CODES "sm_103")
endif()
if(CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 13.4)
set(CUVS_CUTILE_SM107_ENABLED 1)
set(CUVS_CUTILE_EXCLUDED_GPU_CODES "")
else()
list(APPEND CUVS_CUTILE_EXCLUDED_GPU_CODES "sm_107")
endif()
cuvs_cutile_setup(CUVS_CUTILE_ENABLED cutile_python cutile_bin2c)
if(CUVS_CUTILE_ENABLED)
Expand Down Expand Up @@ -1595,6 +1602,7 @@ if(NOT BUILD_CPU_ONLY)
target_compile_definitions(
cuvs_objs
PRIVATE CUVS_CUTILE_ENABLED=${CUVS_CUTILE_ENABLED}
CUVS_CUTILE_SM103_ENABLED=${CUVS_CUTILE_SM103_ENABLED}
CUVS_CUTILE_SM107_ENABLED=${CUVS_CUTILE_SM107_ENABLED}
$<$<BOOL:${BUILD_CAGRA_HNSWLIB}>:CUVS_BUILD_CAGRA_HNSWLIB>
$<$<BOOL:${BUILD_MG_ALGOS}>:CUVS_BUILD_MG_ALGOS>
Expand Down
12 changes: 12 additions & 0 deletions cpp/include/cuvs/detail/jit_lto/cutile_arch_tags.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
#define CUVS_CUTILE_ENABLED 0
#endif

#ifndef CUVS_CUTILE_SM103_ENABLED
#define CUVS_CUTILE_SM103_ENABLED 0
#endif

#ifndef CUVS_CUTILE_SM107_ENABLED
#define CUVS_CUTILE_SM107_ENABLED 0
#endif
Expand Down Expand Up @@ -38,6 +42,13 @@ struct cutile_arch_10_0 {
static constexpr int cc_minor = 0;
};

#if CUVS_CUTILE_SM103_ENABLED
struct cutile_arch_10_3 {
static constexpr int cc_major = 10;
static constexpr int cc_minor = 3;
};
#endif

#if CUVS_CUTILE_SM107_ENABLED
struct cutile_arch_10_7 {
static constexpr int cc_major = 10;
Expand All @@ -54,6 +65,7 @@ inline bool is_embedded_cubin_arch(int cc_major, int cc_minor)
{
return (cc_major == 8 && (cc_minor == 0 || cc_minor == 6)) || (cc_major == 9 && cc_minor == 0) ||
(cc_major == 10 && cc_minor == 0) ||
(CUVS_CUTILE_SM103_ENABLED && cc_major == 10 && cc_minor == 3) ||
(CUVS_CUTILE_SM107_ENABLED && cc_major == 10 && cc_minor == 7) ||
(cc_major == 12 && cc_minor == 0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_86", "arch_tag": "cutile_arch_8_6", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"},
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_90", "arch_tag": "cutile_arch_9_0", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"},
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_100", "arch_tag": "cutile_arch_10_0", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"},
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_103", "arch_tag": "cutile_arch_10_3", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"},
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_107", "arch_tag": "cutile_arch_10_7", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"},
{"output_format": "cubin", "register": "cubin", "gpu_code": "sm_120", "arch_tag": "cutile_arch_12_0", "artifact_basename": "@gpu_code@", "artifact_ext": "cubin"}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,44 @@
"tile_k": 32
}
],
"gpu_code": "sm_100",
"_architecture": [
{
"gpu_code": "sm_100",
"cc_major": 10,
"cc_minor": 0,
"arch_tag": "cutile_arch_10_0"
}
]
},
{
"data_type": "float",
"data_abbrev": "f",
"_abi": [
{
"matrix_layout": "relaxed",
"abi_abbrev": "relaxed",
"abi_tag": "cutile_abi_relaxed",
"tile_m": 256,
"tile_n": 256,
"tile_k": 64,
"occupancy": 2,
"num_ctas": 2
},
{
"matrix_layout": "strict",
"abi_abbrev": "strict",
"abi_tag": "cutile_abi_strict",
"tile_m": 128,
"tile_n": 256,
"tile_k": 32,
"occupancy": 2,
"num_ctas": 2
}
],
"gpu_code": "sm_103",
"cc_major": 10,
"cc_minor": 0,
"arch_tag": "cutile_arch_10_0"
"cc_minor": 3,
"arch_tag": "cutile_arch_10_3"
},
{
"data_type": "half",
Expand All @@ -198,10 +232,44 @@
"tile_k": 128
}
],
"gpu_code": "sm_100",
"_architecture": [
{
"gpu_code": "sm_100",
"cc_major": 10,
"cc_minor": 0,
"arch_tag": "cutile_arch_10_0"
}
]
},
{
"data_type": "half",
"data_abbrev": "h",
"_abi": [
{
"matrix_layout": "relaxed",
"abi_abbrev": "relaxed",
"abi_tag": "cutile_abi_relaxed",
"tile_m": 256,
"tile_n": 256,
"tile_k": 32,
"occupancy": 2,
"num_ctas": 2
},
{
"matrix_layout": "strict",
"abi_abbrev": "strict",
"abi_tag": "cutile_abi_strict",
"tile_m": 128,
"tile_n": 256,
"tile_k": 64,
"occupancy": 2,
"num_ctas": 2
}
],
"gpu_code": "sm_103",
"cc_major": 10,
"cc_minor": 0,
"arch_tag": "cutile_arch_10_0"
"cc_minor": 3,
"arch_tag": "cutile_arch_10_3"
},
{
"data_type": "float",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ struct Fused1nnTilePlanner : cuvs::detail::jit_lto::TileAlgorithmPlanner {
void add_entrypoint()
{
using cuvs::detail::jit_lto::cutile_arch_10_0;
#if CUVS_CUTILE_SM103_ENABLED
using cuvs::detail::jit_lto::cutile_arch_10_3;
#endif
#if CUVS_CUTILE_SM107_ENABLED
using cuvs::detail::jit_lto::cutile_arch_10_7;
#endif
Expand Down Expand Up @@ -98,6 +101,16 @@ struct Fused1nnTilePlanner : cuvs::detail::jit_lto::TileAlgorithmPlanner {
std::conditional_t<is_relaxed,
fused_1nn_matrix_tile_h_cutile_arch_10_0_relaxed,
fused_1nn_matrix_tile_h_cutile_arch_10_0_strict>>;
#if CUVS_CUTILE_SM103_ENABLED
using Tile103 =
std::conditional_t<is_float,
std::conditional_t<is_relaxed,
fused_1nn_matrix_tile_f_cutile_arch_10_3_relaxed,
fused_1nn_matrix_tile_f_cutile_arch_10_3_strict>,
std::conditional_t<is_relaxed,
fused_1nn_matrix_tile_h_cutile_arch_10_3_relaxed,
fused_1nn_matrix_tile_h_cutile_arch_10_3_strict>>;
#endif
using Tile120 =
std::conditional_t<is_float,
std::conditional_t<is_relaxed,
Expand All @@ -115,6 +128,10 @@ struct Fused1nnTilePlanner : cuvs::detail::jit_lto::TileAlgorithmPlanner {
fragment_tag_fused_1nn_cubin<DataTag, IndexTag, Tile90, AbiTag, cutile_arch_9_0>>();
this->add_static_fragment<
fragment_tag_fused_1nn_cubin<DataTag, IndexTag, Tile100, AbiTag, cutile_arch_10_0>>();
#if CUVS_CUTILE_SM103_ENABLED
this->add_static_fragment<
fragment_tag_fused_1nn_cubin<DataTag, IndexTag, Tile103, AbiTag, cutile_arch_10_3>>();
#endif
#if CUVS_CUTILE_SM107_ENABLED
using Tile107 =
std::conditional_t<is_float,
Expand Down
6 changes: 4 additions & 2 deletions cpp/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,10 @@ ConfigureTest(
PERCENT 100
)
target_compile_definitions(
CUTILE_SMOKE_TEST PRIVATE CUVS_CUTILE_ENABLED=${CUVS_CUTILE_ENABLED}
CUVS_CUTILE_SM107_ENABLED=${CUVS_CUTILE_SM107_ENABLED}
CUTILE_SMOKE_TEST
PRIVATE CUVS_CUTILE_ENABLED=${CUVS_CUTILE_ENABLED}
CUVS_CUTILE_SM103_ENABLED=${CUVS_CUTILE_SM103_ENABLED}
CUVS_CUTILE_SM107_ENABLED=${CUVS_CUTILE_SM107_ENABLED}
)
if(CUVS_CUTILE_ENABLED)
# These are intentionally library-private implementation symbols. Build the smoke executable with
Expand Down
20 changes: 19 additions & 1 deletion cpp/tests/detail/jit_lto/cutile_smoke.cu
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ std::vector<std::unique_ptr<CubinFragmentEntry>> make_smoke_fragments()
fragments.emplace_back(std::make_unique<smoke_fragment<cutile_arch_9_0>>());
fragments.emplace_back(std::make_unique<smoke_fragment<cutile_arch_10_0>>());
fragments.emplace_back(std::make_unique<smoke_fragment<cutile_arch_12_0>>());
#if CUVS_CUTILE_SM103_ENABLED
fragments.emplace_back(std::make_unique<smoke_fragment<cutile_arch_10_3>>());
#endif
#if CUVS_CUTILE_SM107_ENABLED
fragments.emplace_back(std::make_unique<smoke_fragment<cutile_arch_10_7>>());
#endif
Expand All @@ -53,6 +56,9 @@ void add_smoke_fragments(TileAlgorithmPlanner& planner)
planner.add_static_fragment<fragment_tag_cutile_smoke_add_cubin<cutile_arch_9_0>>();
planner.add_static_fragment<fragment_tag_cutile_smoke_add_cubin<cutile_arch_10_0>>();
planner.add_static_fragment<fragment_tag_cutile_smoke_add_cubin<cutile_arch_12_0>>();
#if CUVS_CUTILE_SM103_ENABLED
planner.add_static_fragment<fragment_tag_cutile_smoke_add_cubin<cutile_arch_10_3>>();
#endif
#if CUVS_CUTILE_SM107_ENABLED
planner.add_static_fragment<fragment_tag_cutile_smoke_add_cubin<cutile_arch_10_7>>();
#endif
Expand All @@ -71,8 +77,20 @@ TEST(CutileSmoke, ResolvesExactArchitectureOrSm89Compatibility)
EXPECT_EQ(find_compatible_cubin_fragment(9, 1, fragments), nullptr);
EXPECT_EQ(find_compatible_cubin_fragment(10, 0, fragments), fragments[3].get());
EXPECT_EQ(find_compatible_cubin_fragment(10, 1, fragments), nullptr);
EXPECT_EQ(find_compatible_cubin_fragment(10, 2, fragments), nullptr);
EXPECT_FALSE(is_embedded_cubin_arch(10, 2));
#if CUVS_CUTILE_SM103_ENABLED
EXPECT_EQ(find_compatible_cubin_fragment(10, 3, fragments), fragments[5].get());
EXPECT_TRUE(is_embedded_cubin_arch(10, 3));
#else
EXPECT_EQ(find_compatible_cubin_fragment(10, 3, fragments), nullptr);
EXPECT_FALSE(is_embedded_cubin_arch(10, 3));
#endif
EXPECT_EQ(find_compatible_cubin_fragment(10, 4, fragments), nullptr);
EXPECT_FALSE(is_embedded_cubin_arch(10, 4));
#if CUVS_CUTILE_SM107_ENABLED
EXPECT_EQ(find_compatible_cubin_fragment(10, 7, fragments), fragments[5].get());
EXPECT_EQ(find_compatible_cubin_fragment(10, 7, fragments),
fragments[5 + CUVS_CUTILE_SM103_ENABLED].get());
#else
EXPECT_EQ(find_compatible_cubin_fragment(10, 7, fragments), nullptr);
#endif
Expand Down
Loading