From 0a3229ea22f461a226dc215340fd0e6ddd4e023c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kocot?= Date: Fri, 20 Mar 2026 14:19:31 +0100 Subject: [PATCH] [CK][CK Tile] Move grouped conv cpp instances to build dir (#5609) ## Motivation Move grouped conv .cpp instances to build dir. Fix generate instances script. ## Technical Details Avoid CI problem when instances in experimental directory are not removed ## Test Plan test_grouped_convnd_*_tile ## Test Result Pending ## Submission Checklist - [x] Look over the contributing guidelines at https://github.com/ROCm/ROCm/blob/develop/CONTRIBUTING.md#pull-requests. --- .../CMakeLists.txt | 8 +-- .../generate_instances.py | 60 ++++++++++++------- .../grouped_convolution_tile.cpp.in | 0 .../instance_includes.inc | 0 .../{instances => include}/instance_run.inc | 0 5 files changed, 41 insertions(+), 27 deletions(-) rename experimental/grouped_convolution_tile_instances/{instances => include}/grouped_convolution_tile.cpp.in (100%) rename experimental/grouped_convolution_tile_instances/{instances => include}/instance_includes.inc (100%) rename experimental/grouped_convolution_tile_instances/{instances => include}/instance_run.inc (100%) diff --git a/experimental/grouped_convolution_tile_instances/CMakeLists.txt b/experimental/grouped_convolution_tile_instances/CMakeLists.txt index a2a4568c5d..51e24fc476 100644 --- a/experimental/grouped_convolution_tile_instances/CMakeLists.txt +++ b/experimental/grouped_convolution_tile_instances/CMakeLists.txt @@ -3,13 +3,13 @@ if(GPU_TARGETS MATCHES "gfx9") # Generate instances using python script if instance directories don't exist - set(INSTANCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/instances) + set(INSTANCES_DIR ${CMAKE_CURRENT_BINARY_DIR}) if(NOT EXISTS ${INSTANCES_DIR}/forward OR NOT EXISTS ${INSTANCES_DIR}/backward_weight OR NOT EXISTS ${INSTANCES_DIR}/backward_data) find_package(Python3 COMPONENTS Interpreter Development) execute_process( - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_instances.py --mode=tests + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_instances.py --mode=tests --instances_dir=${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE ret OUTPUT_VARIABLE output ERROR_VARIABLE error @@ -21,13 +21,13 @@ if(GPU_TARGETS MATCHES "gfx9") endif() # Find cpp files and create lib for instances - file(GLOB_RECURSE GROUPED_CONV_FWD_TILE "instances/forward/*.cpp") + file(GLOB_RECURSE GROUPED_CONV_FWD_TILE "${CMAKE_CURRENT_BINARY_DIR}/forward/*.cpp") add_instance_library(device_grouped_conv_fwd_tile_instances ${GROUPED_CONV_FWD_TILE}) target_include_directories(device_grouped_conv_fwd_tile_instances PRIVATE "${PROJECT_SOURCE_DIR}/experimental/builder/test/utils") target_compile_options(device_grouped_conv_fwd_tile_instances PRIVATE -DCK_TILE_FLOAT_TO_BFLOAT16_DEFAULT=0) - file(GLOB_RECURSE GROUPED_CONV_BWD_WEIGHT_TILE "instances/backward_weight/*.cpp") + file(GLOB_RECURSE GROUPED_CONV_BWD_WEIGHT_TILE "${CMAKE_CURRENT_BINARY_DIR}/backward_weight/*.cpp") add_instance_library(device_grouped_conv_bwd_weight_tile_instances ${GROUPED_CONV_BWD_WEIGHT_TILE}) target_include_directories(device_grouped_conv_bwd_weight_tile_instances PRIVATE "${PROJECT_SOURCE_DIR}/experimental/builder/test/utils") diff --git a/experimental/grouped_convolution_tile_instances/generate_instances.py b/experimental/grouped_convolution_tile_instances/generate_instances.py index b2cb37c39b..a25dc9c262 100755 --- a/experimental/grouped_convolution_tile_instances/generate_instances.py +++ b/experimental/grouped_convolution_tile_instances/generate_instances.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT import argparse +import shutil from pathlib import Path class ConvInstanceTemplateParams: @@ -137,6 +138,12 @@ def parse_instance_string(instance_string): return params +def copy_includes(instances_path): + inc_dir = Path(__file__).resolve().parent + output_dir = Path(instances_path) + output_dir.mkdir(parents=True, exist_ok=True) + shutil.copy(f"{inc_dir}/include/instance_includes.inc", instances_path) + shutil.copy(f"{inc_dir}/include/instance_run.inc", instances_path) def generate_calls_inc(instances, problem_name, direction, filter_pattern): generate_dir = Path(__file__).resolve().parent @@ -168,17 +175,17 @@ def generate_defs_inc(instances, problem_name, signature, direction, filter_patt def generate_conv_cpp( - instances, problem_name, config, direction, signature_name, filter_pattern): + instances, problem_name, config, direction, signature_name, filter_pattern, instances_path): for instance in instances: if problem_name.find(filter_pattern) == -1: break instance_name = problem_name + "_" + str(instance.id) - generate_dir = Path(__file__).resolve().parent - directory_path = Path(f"{generate_dir}/instances/{direction}/{config}") + directory_path = Path(f"{instances_path}/{direction}/{config}") directory_path.mkdir(parents=True, exist_ok=True) - template_file = "grouped_convolution_tile.cpp.in" + parent_dir = Path(__file__).resolve().parent + template_file = "include/grouped_convolution_tile.cpp.in" - with open(f"{generate_dir}/instances/{template_file}", "r",) as f: + with open(f"{parent_dir}/{template_file}", "r",) as f: content = f.read() content = content.replace("gen_signature", signature_name) @@ -189,7 +196,7 @@ def generate_conv_cpp( content = content.replace("gen_block_transfer", instance.get_block_transfer()) content = content.replace("gen_optimizations", instance.get_optimizations()) - with open(f"{generate_dir}/instances/{direction}/{config}/{instance_name}.cpp","w",) as f: + with open(f"{instances_path}/{direction}/{config}/{instance_name}.cpp","w",) as f: f.write(content) @@ -484,7 +491,7 @@ def parse_bwd_data_instances(instances, problem_name): # TODO: Implement parsing logic for backward data instances. return convs -def generate_instances_fwd(instances, problem_name, config, filter_pattern): +def generate_instances_fwd(instances, problem_name, config, filter_pattern, instances_path): direction = "forward" signature_name = f"SIGNATURE_{config.upper()}_FWD" instances = parse_fwd_instances(instances, problem_name) @@ -494,13 +501,13 @@ def generate_instances_fwd(instances, problem_name, config, filter_pattern): problem_name, signature_name, direction, - filter_pattern, + filter_pattern ) generate_conv_cpp( - instances, problem_name, config, direction, signature_name, filter_pattern + instances, problem_name, config, direction, signature_name, filter_pattern, instances_path ) -def generate_instances_bwd_weight(instances, problem_name, config, filter_pattern): +def generate_instances_bwd_weight(instances, problem_name, config, filter_pattern, instances_path): direction = "backward_weight" signature_name = f"SIGNATURE_{config.upper()}_BWD_WEIGHT" instances = parse_bwd_weight_instances(instances, problem_name) @@ -510,13 +517,13 @@ def generate_instances_bwd_weight(instances, problem_name, config, filter_patter problem_name, signature_name, direction, - filter_pattern, + filter_pattern ) generate_conv_cpp( - instances, problem_name, config, direction, signature_name, filter_pattern + instances, problem_name, config, direction, signature_name, filter_pattern, instances_path ) -def generate_instances_bwd_data(instances, problem_name, config, filter_pattern): +def generate_instances_bwd_data(instances, problem_name, config, filter_pattern, instances_path): direction = "backward_data" signature_name = f"SIGNATURE_{config.upper()}_BWD_DATA" instances = parse_bwd_data_instances(instances, problem_name) @@ -526,13 +533,13 @@ def generate_instances_bwd_data(instances, problem_name, config, filter_pattern) problem_name, signature_name, direction, - filter_pattern, + filter_pattern ) generate_conv_cpp( - instances, problem_name, config, direction, signature_name, filter_pattern + instances, problem_name, config, direction, signature_name, filter_pattern, instances_path ) -def process_direction(configs, direction, generate_func, configs_prefix, filter_pattern): +def process_direction(configs, direction, generate_func, configs_prefix, filter_pattern, instances_path): """Helper function to process a single direction.""" for config in configs: instances = [] @@ -551,7 +558,7 @@ def process_direction(configs, direction, generate_func, configs_prefix, filter_ else: raise RuntimeError(f"Unknown direction: {direction}") - generate_func(instances, problem_name, config, filter_pattern) + generate_func(instances, problem_name, config, filter_pattern, instances_path) if __name__ == "__main__": fwd_configs = [ @@ -605,6 +612,12 @@ if __name__ == "__main__": default="all", help="Convolution direction for which to generate instances." ) + parser.add_argument( + "--instances_dir", + type=str, + default="../build/experimental/grouped_convolution_tile_instances", + help="Directory store generated instances." + ) args = parser.parse_args() # apply empty filter @@ -618,15 +631,16 @@ if __name__ == "__main__": else: raise RuntimeError("wrong mode") + copy_includes(args.instances_dir) match args.direction: case "forward": - process_direction(fwd_configs, args.direction, generate_instances_fwd, configs_prefix, args.filter_pattern) + process_direction(fwd_configs, args.direction, generate_instances_fwd, configs_prefix, args.filter_pattern, args.instances_dir) case "backward_weight": - process_direction(bwd_weight_configs, args.direction, generate_instances_bwd_weight, configs_prefix, args.filter_pattern) + process_direction(bwd_weight_configs, args.direction, generate_instances_bwd_weight, configs_prefix, args.filter_pattern, args.instances_dir) case "backward_data": - process_direction(bwd_data_configs, args.direction, generate_instances_bwd_data, configs_prefix, args.filter_pattern) + process_direction(bwd_data_configs, args.direction, generate_instances_bwd_data, configs_prefix, args.filter_pattern, args.instances_dir) case "all": - process_direction(fwd_configs, "forward", generate_instances_fwd, configs_prefix, args.filter_pattern) - process_direction(bwd_weight_configs, "backward_weight", generate_instances_bwd_weight, configs_prefix, args.filter_pattern) - process_direction(bwd_data_configs, "backward_data", generate_instances_bwd_data, configs_prefix, args.filter_pattern) + process_direction(fwd_configs, "forward", generate_instances_fwd, configs_prefix, args.filter_pattern, args.instances_dir) + process_direction(bwd_weight_configs, "backward_weight", generate_instances_bwd_weight, configs_prefix, args.filter_pattern, args.instances_dir) + process_direction(bwd_data_configs, "backward_data", generate_instances_bwd_data, configs_prefix, args.filter_pattern, args.instances_dir) diff --git a/experimental/grouped_convolution_tile_instances/instances/grouped_convolution_tile.cpp.in b/experimental/grouped_convolution_tile_instances/include/grouped_convolution_tile.cpp.in similarity index 100% rename from experimental/grouped_convolution_tile_instances/instances/grouped_convolution_tile.cpp.in rename to experimental/grouped_convolution_tile_instances/include/grouped_convolution_tile.cpp.in diff --git a/experimental/grouped_convolution_tile_instances/instances/instance_includes.inc b/experimental/grouped_convolution_tile_instances/include/instance_includes.inc similarity index 100% rename from experimental/grouped_convolution_tile_instances/instances/instance_includes.inc rename to experimental/grouped_convolution_tile_instances/include/instance_includes.inc diff --git a/experimental/grouped_convolution_tile_instances/instances/instance_run.inc b/experimental/grouped_convolution_tile_instances/include/instance_run.inc similarity index 100% rename from experimental/grouped_convolution_tile_instances/instances/instance_run.inc rename to experimental/grouped_convolution_tile_instances/include/instance_run.inc