This is an automated email from the ASF dual-hosted git repository. tqchen pushed a commit to branch tirx/standalone-package-cleanup in repository https://gitbox.apache.org/repos/asf/tvm.git
commit 144ecab59d852bb3217389a53acf2125cb3cb69f Author: Tianqi Chen <[email protected]> AuthorDate: Thu Oct 15 05:25:17 2026 +0000 [FIX][CUDA] Bound embedded launch source literals for MSVC --- tirx/python/tvm_tirx/backend/cuda/launch/generate.py | 12 +++++++++--- tirx/src/backend/cuda/launch/launch_source.h | 18 ++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/tirx/python/tvm_tirx/backend/cuda/launch/generate.py b/tirx/python/tvm_tirx/backend/cuda/launch/generate.py index 381ac5c913..5e546a650b 100644 --- a/tirx/python/tvm_tirx/backend/cuda/launch/generate.py +++ b/tirx/python/tvm_tirx/backend/cuda/launch/generate.py @@ -333,14 +333,20 @@ def main(): .replace('#include "launch_attributes.h"', ""), ] ) + # MSVC limits individual string literals to 16380 bytes before concatenation. + chunks = [""] + for line in ("\n" + support + "\n").splitlines(keepends=True): + if len((chunks[-1] + line).encode("utf-8")) > 8000: + chunks.append("") + chunks[-1] += line outputs[ROOT / "src/backend/cuda/launch/launch_source.h"] = ( CPP_LICENSE + "\n// Generated by launch/generate.py; edit the registry or launch_config.h.\n" "#ifndef TVM_BACKEND_CUDA_LAUNCH_LAUNCH_SOURCE_H_\n" "#define TVM_BACKEND_CUDA_LAUNCH_LAUNCH_SOURCE_H_\n" - 'namespace tvm_cuda_launch {\ninline constexpr const char* kSupportSource = R"TVM_CUDA_LAUNCH(\n' - + support - + '\n)TVM_CUDA_LAUNCH";\n}\n#endif\n' + "namespace tvm_cuda_launch {\ninline constexpr const char* kSupportSource =\n" + + "\n".join(f'R"TVM_CUDA_LAUNCH({chunk})TVM_CUDA_LAUNCH"' for chunk in chunks) + + ";\n}\n#endif\n" ) source_path = ROOT / "src/backend/cuda/launch/launch_source.h" outputs[source_path] = format_output(source_path, outputs[source_path]) diff --git a/tirx/src/backend/cuda/launch/launch_source.h b/tirx/src/backend/cuda/launch/launch_source.h index 1f8dbd9563..df5125f8a1 100644 --- a/tirx/src/backend/cuda/launch/launch_source.h +++ b/tirx/src/backend/cuda/launch/launch_source.h @@ -21,7 +21,8 @@ #ifndef TVM_BACKEND_CUDA_LAUNCH_LAUNCH_SOURCE_H_ #define TVM_BACKEND_CUDA_LAUNCH_LAUNCH_SOURCE_H_ namespace tvm_cuda_launch { -inline constexpr const char* kSupportSource = R"TVM_CUDA_LAUNCH( +inline constexpr const char* kSupportSource = + R"TVM_CUDA_LAUNCH( /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -223,7 +224,8 @@ inline void NormalizeLegacyPresence(LaunchValues* values) { /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information +)TVM_CUDA_LAUNCH" + R"TVM_CUDA_LAUNCH( * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance @@ -400,7 +402,8 @@ inline unsigned EncodeDriverAttributes(const LaunchValues& config, #if CUDA_VERSION >= 13020 auto& attr = (*attrs)[count++]; attr.id = CU_LAUNCH_ATTRIBUTE_PORTABLE_CLUSTER_SIZE_MODE; - attr.value.portableClusterSizeMode = static_cast<decltype(attr.value.portableClusterSizeMode)>( +)TVM_CUDA_LAUNCH" + R"TVM_CUDA_LAUNCH( attr.value.portableClusterSizeMode = static_cast<decltype(attr.value.portableClusterSizeMode)>( config.Get(Field::kPortableClusterSizeMode).integer); #else throw std::invalid_argument( @@ -574,7 +577,8 @@ inline unsigned EncodeRuntimeAttributes(const LaunchValues& config, attr.val.accessPolicyWindow.missProp = static_cast<decltype(attr.val.accessPolicyWindow.missProp)>( config.Get(Field::kAccessPolicyWindowMissProp).integer); -#else +)TVM_CUDA_LAUNCH" + R"TVM_CUDA_LAUNCH(#else throw std::invalid_argument( "CUDA launch field access_policy_window requires toolkit 12.0 or newer"); #endif @@ -759,7 +763,8 @@ inline LaunchValues Normalize(LaunchValues config, const KernelRequirements& ker } } for (Field flag : - {Field::kCooperative, Field::kProgrammaticStreamSerialization, +)TVM_CUDA_LAUNCH" + R"TVM_CUDA_LAUNCH( {Field::kCooperative, Field::kProgrammaticStreamSerialization, Field::kNvlinkUtilCentricScheduling, Field::kProgrammaticEventTriggerAtBlockStart}) { Require(config.Int(flag) == 0 || config.Int(flag) == 1, std::string(kFields[static_cast<size_t>(flag)].name) + " must be a boolean"); @@ -933,7 +938,8 @@ inline void EncodeRuntime(const LaunchValues& values, const KernelRequirements& *block[axis] = values.Int(Axis(Field::kBlockX, axis)); if (kernel.required_block_size) { #if CUDART_VERSION >= 13000 - *grid[axis] /= values.Int(Axis(Field::kClusterX, axis)); +)TVM_CUDA_LAUNCH" + R"TVM_CUDA_LAUNCH( *grid[axis] /= values.Int(Axis(Field::kClusterX, axis)); *block[axis] = 1; #else throw std::invalid_argument("CUDA required block size requires CUDA 13 or newer");
