GitOrigin-RevId: ebe71f5a12
tags/v1.6.0-rc1
@@ -10,7 +10,6 @@ import os.path | |||||
import shutil | import shutil | ||||
from typing import Tuple, List | from typing import Tuple, List | ||||
from lazy_file import LazyFile | |||||
from library import * | from library import * | ||||
################################################################################################### | ################################################################################################### | ||||
@@ -584,7 +583,7 @@ void initialize_${operation_name}(Manifest &manifest) { | |||||
# | # | ||||
def __enter__(self): | def __enter__(self): | ||||
self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | ||||
self.kernel_file = LazyFile(self.kernel_path) | |||||
self.kernel_file = open(self.kernel_path, "w") | |||||
self.kernel_file.write(self.header_template) | self.kernel_file.write(self.header_template) | ||||
return self | return self | ||||
@@ -10,7 +10,6 @@ import shutil | |||||
import functools | import functools | ||||
import operator | import operator | ||||
from lazy_file import LazyFile | |||||
from library import * | from library import * | ||||
@@ -1045,7 +1044,7 @@ void initialize_${operation_name}(Manifest &manifest) { | |||||
# | # | ||||
def __enter__(self): | def __enter__(self): | ||||
self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | ||||
self.kernel_file = LazyFile(self.kernel_path) | |||||
self.kernel_file = open(self.kernel_path, "w") | |||||
self.kernel_file.write(self.header_template) | self.kernel_file.write(self.header_template) | ||||
return self | return self | ||||
@@ -1109,7 +1108,7 @@ ${operation_instance} | |||||
# | # | ||||
def __enter__(self): | def __enter__(self): | ||||
self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | self.kernel_path = os.path.join(self.kernel_path, "%s.cu" % self.operation.procedural_name()) | ||||
self.kernel_file = LazyFile(self.kernel_path) | |||||
self.kernel_file = open(self.kernel_path, "w") | |||||
self.kernel_file.write(SubstituteTemplate(self.header_template, { | self.kernel_file.write(SubstituteTemplate(self.header_template, { | ||||
'wrapper_path': self.wrapper_path, | 'wrapper_path': self.wrapper_path, | ||||
})) | })) | ||||
@@ -1,27 +0,0 @@ | |||||
# | |||||
# \file lazy_file.py | |||||
# | |||||
# \brief LazyFile updates the target file only when the content is changed | |||||
# in order to avoid generating new cutlass kimpls each time cmake is called | |||||
# | |||||
import io | |||||
import os | |||||
class LazyFile: | |||||
def __init__(self, filename): | |||||
self.filename = filename | |||||
self.buffer = io.StringIO() | |||||
def write(self, data): | |||||
self.buffer.write(str(data)) | |||||
def close(self): | |||||
if os.path.isfile(self.filename): | |||||
old_data = open(self.filename).read() | |||||
else: | |||||
old_data = "" | |||||
new_data = self.buffer.getvalue() | |||||
if old_data != new_data: | |||||
with open(self.filename, "w") as f: | |||||
f.write(new_data) |
@@ -8,7 +8,6 @@ import enum | |||||
import os.path | import os.path | ||||
import shutil | import shutil | ||||
from lazy_file import LazyFile | |||||
from library import * | from library import * | ||||
from gemm_operation import * | from gemm_operation import * | ||||
from conv2d_operation import * | from conv2d_operation import * | ||||
@@ -353,7 +352,7 @@ void initialize_all(Manifest &manifest) { | |||||
def GenerateManifest(args, operations, output_dir): | def GenerateManifest(args, operations, output_dir): | ||||
manifest_path = os.path.join(output_dir, "all_%s_%s_operations.cu" % (args.operations, args.type)) | manifest_path = os.path.join(output_dir, "all_%s_%s_operations.cu" % (args.operations, args.type)) | ||||
f = LazyFile(manifest_path) | |||||
f = open(manifest_path, "w") | |||||
f.write(""" | f.write(""" | ||||
/* | /* | ||||
Generated by generator.py - Do not edit. | Generated by generator.py - Do not edit. | ||||
@@ -116,11 +116,18 @@ if(MGE_WITH_CUDA) | |||||
set(CUTLASS_GEN_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/cutlass_generator/generator.py) | set(CUTLASS_GEN_SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/cutlass_generator/generator.py) | ||||
set(CUTLASS_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/cuda/cutlass/generated) | set(CUTLASS_GEN_DIR ${CMAKE_CURRENT_BINARY_DIR}/cuda/cutlass/generated) | ||||
function(gen_cutlass_kimpl op type) | |||||
set(CUTLASS_SOURCES "") | |||||
function(gen_cutlass_kimpl op type gen_files) | |||||
set(CURRENT_CUTLASS_STAGE_DIR ${CUTLASS_GEN_DIR}/${op}_${type}.stage) | |||||
set(CURRENT_CUTLASS_GEN_DIR ${CUTLASS_GEN_DIR}/${op}_${type}) | set(CURRENT_CUTLASS_GEN_DIR ${CUTLASS_GEN_DIR}/${op}_${type}) | ||||
set_directory_properties(PROPERTIES CMAKE_CONFIGURE_DEPENDS ${CUTLASS_GEN_SCRIPT}) | |||||
file(REMOVE_RECURSE ${CURRENT_CUTLASS_STAGE_DIR}) | |||||
file(MAKE_DIRECTORY ${CURRENT_CUTLASS_STAGE_DIR}) | |||||
file(MAKE_DIRECTORY ${CURRENT_CUTLASS_GEN_DIR}) | file(MAKE_DIRECTORY ${CURRENT_CUTLASS_GEN_DIR}) | ||||
execute_process( | execute_process( | ||||
COMMAND ${PYTHON3_EXECUTABLE_WITHOUT_VERSION} ${CUTLASS_GEN_SCRIPT} --operations ${op} --type ${type} ${CURRENT_CUTLASS_GEN_DIR} | |||||
COMMAND ${PYTHON3_EXECUTABLE_WITHOUT_VERSION} ${CUTLASS_GEN_SCRIPT} --operations ${op} --type ${type} ${CURRENT_CUTLASS_STAGE_DIR} | |||||
RESULT_VARIABLE gen_cutlass_result | RESULT_VARIABLE gen_cutlass_result | ||||
OUTPUT_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log | OUTPUT_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log | ||||
ERROR_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log | ERROR_FILE ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log | ||||
@@ -128,14 +135,27 @@ if(MGE_WITH_CUDA) | |||||
if (NOT gen_cutlass_result EQUAL 0) | if (NOT gen_cutlass_result EQUAL 0) | ||||
message(FATAL_ERROR "Error generating library instances. See ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log") | message(FATAL_ERROR "Error generating library instances. See ${CURRENT_CUTLASS_GEN_DIR}/gen_cutlass.log") | ||||
endif() | endif() | ||||
file(GLOB CUTLASS_GEN_FILES RELATIVE "${CURRENT_CUTLASS_GEN_DIR}/" "${CURRENT_CUTLASS_GEN_DIR}/*.cu") | |||||
foreach(FILE ${CUTLASS_GEN_FILES}) | |||||
if (NOT EXISTS "${CURRENT_CUTLASS_STAGE_DIR}/${FILE}") | |||||
file(REMOVE "${CURRENT_CUTLASS_GEN_DIR}/${FILE}") | |||||
endif() | |||||
endforeach() | |||||
file(GLOB CUTLASS_GEN_FILES RELATIVE "${CURRENT_CUTLASS_STAGE_DIR}" "${CURRENT_CUTLASS_STAGE_DIR}/*.cu") | |||||
foreach(FILE ${CUTLASS_GEN_FILES}) | |||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CURRENT_CUTLASS_STAGE_DIR}/${FILE}" "${CURRENT_CUTLASS_GEN_DIR}") | |||||
endforeach() | |||||
file(REMOVE_RECURSE ${CURRENT_CUTLASS_STAGE_DIR}) | |||||
file(GLOB_RECURSE CUTLASS_GEN_FILES "${CURRENT_CUTLASS_GEN_DIR}/*.cu") | |||||
list(APPEND ${gen_files} ${CUTLASS_GEN_FILES}) | |||||
set(${gen_files} "${${gen_files}}" PARENT_SCOPE) | |||||
endfunction() | endfunction() | ||||
gen_cutlass_kimpl(gemm simt) | |||||
gen_cutlass_kimpl(gemv simt) | |||||
gen_cutlass_kimpl(deconv simt) | |||||
gen_cutlass_kimpl(conv2d simt) | |||||
gen_cutlass_kimpl(conv2d tensorop8816) | |||||
gen_cutlass_kimpl(conv2d tensorop8832) | |||||
file(GLOB_RECURSE CUTLASS_SOURCES ${CUTLASS_GEN_DIR}/*.cu) | |||||
gen_cutlass_kimpl(gemm simt CUTLASS_SOURCES) | |||||
gen_cutlass_kimpl(gemv simt CUTLASS_SOURCES) | |||||
gen_cutlass_kimpl(deconv simt CUTLASS_SOURCES) | |||||
gen_cutlass_kimpl(conv2d simt CUTLASS_SOURCES) | |||||
gen_cutlass_kimpl(conv2d tensorop8816 CUTLASS_SOURCES) | |||||
gen_cutlass_kimpl(conv2d tensorop8832 CUTLASS_SOURCES) | |||||
list(APPEND SOURCES ${CUTLASS_SOURCES}) | list(APPEND SOURCES ${CUTLASS_SOURCES}) | ||||
list(APPEND SOURCES ${CUSOURCES}) | list(APPEND SOURCES ${CUSOURCES}) | ||||
endif() | endif() | ||||