GitOrigin-RevId: 5cd34af9bf
tags/v1.7.0
| @@ -0,0 +1,84 @@ | |||||
| # This code is licensed under the MIT License. See the FindBANG.cmake script | |||||
| # for the text of the license. | |||||
| # The MIT License | |||||
| # | |||||
| # License for the specific language governing rights and limitations under | |||||
| # Permission is hereby granted, free of charge, to any person obtaining a | |||||
| # copy of this software and associated documentation files (the "Software"), | |||||
| # to deal in the Software without restriction, including without limitation | |||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
| # and/or sell copies of the Software, and to permit persons to whom the | |||||
| # Software is furnished to do so, subject to the following conditions: | |||||
| # | |||||
| # The above copyright notice and this permission notice shall be included | |||||
| # in all copies or substantial portions of the Software. | |||||
| # | |||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||||
| # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
| # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
| # DEALINGS IN THE SOFTWARE. | |||||
| # | |||||
| ####################################################################### | |||||
| # This converts a file written in makefile syntax into one that can be included | |||||
| # by CMake. | |||||
| file(READ ${input_file} depend_text) | |||||
| if (NOT "${depend_text}" STREQUAL "") | |||||
| # message("FOUND DEPENDS") | |||||
| string(REPLACE "\\ " " " depend_text ${depend_text}) | |||||
| # This works for the cncc -M generated dependency files. | |||||
| string(REGEX REPLACE "^.* : " "" depend_text ${depend_text}) | |||||
| string(REGEX REPLACE "[ \\\\]*\n" ";" depend_text ${depend_text}) | |||||
| set(dependency_list "") | |||||
| foreach(file ${depend_text}) | |||||
| string(REGEX REPLACE "^ +" "" file ${file}) | |||||
| # OK, now if we had a UNC path, cncc has a tendency to only output the first '/' | |||||
| # instead of '//'. Here we will test to see if the file exists, if it doesn't then | |||||
| # try to prepend another '/' to the path and test again. If it still fails remove the | |||||
| # path. | |||||
| if(NOT EXISTS "${file}") | |||||
| if (EXISTS "/${file}") | |||||
| set(file "/${file}") | |||||
| else() | |||||
| message(WARNING " Removing non-existent dependency file: ${file}") | |||||
| set(file "") | |||||
| endif() | |||||
| endif() | |||||
| if(NOT IS_DIRECTORY "${file}") | |||||
| # If softlinks start to matter, we should change this to REALPATH. For now we need | |||||
| # to flatten paths, because cncc can generate stuff like /bin/../include instead of | |||||
| # just /include. | |||||
| get_filename_component(file_absolute "${file}" ABSOLUTE) | |||||
| list(APPEND dependency_list "${file_absolute}") | |||||
| endif() | |||||
| endforeach() | |||||
| else() | |||||
| # message("FOUND NO DEPENDS") | |||||
| endif() | |||||
| # Remove the duplicate entries and sort them. | |||||
| list(REMOVE_DUPLICATES dependency_list) | |||||
| list(SORT dependency_list) | |||||
| foreach(file ${dependency_list}) | |||||
| set(bang_cncc_depend "${bang_cncc_depend} \"${file}\"\n") | |||||
| endforeach() | |||||
| file(WRITE ${output_file} "# Generated by: make2cmake.cmake\nSET(BANG_CNCC_DEPEND\n ${bang_cncc_depend})\n\n") | |||||
| @@ -0,0 +1,103 @@ | |||||
| # This code is licensed under the MIT License. See the FindBANG.cmake script | |||||
| # for the text of the license. | |||||
| # The MIT License | |||||
| # | |||||
| # License for the specific language governing rights and limitations under | |||||
| # Permission is hereby granted, free of charge, to any person obtaining a | |||||
| # copy of this software and associated documentation files (the "Software"), | |||||
| # to deal in the Software without restriction, including without limitation | |||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
| # and/or sell copies of the Software, and to permit persons to whom the | |||||
| # Software is furnished to do so, subject to the following conditions: | |||||
| # | |||||
| # The above copyright notice and this permission notice shall be included | |||||
| # in all copies or substantial portions of the Software. | |||||
| # | |||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||||
| # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
| # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
| # DEALINGS IN THE SOFTWARE. | |||||
| # | |||||
| ####################################################################### | |||||
| # Parses a .cnbin file produced by cncc and reports statistics about the file. | |||||
| file(READ ${input_file} file_text) | |||||
| if (NOT "${file_text}" STREQUAL "") | |||||
| string(REPLACE ";" "\\;" file_text ${file_text}) | |||||
| string(REPLACE "\ncode" ";code" file_text ${file_text}) | |||||
| list(LENGTH file_text len) | |||||
| foreach(line ${file_text}) | |||||
| # Only look at "code { }" blocks. | |||||
| if(line MATCHES "^code") | |||||
| # Break into individual lines. | |||||
| string(REGEX REPLACE "\n" ";" line ${line}) | |||||
| foreach(entry ${line}) | |||||
| # Extract kernel names. | |||||
| if (${entry} MATCHES "[^g]name = ([^ ]+)") | |||||
| set(entry "${CMAKE_MATCH_1}") | |||||
| # Check to see if the kernel name starts with "_" | |||||
| set(skip FALSE) | |||||
| # if (${entry} MATCHES "^_") | |||||
| # Skip the rest of this block. | |||||
| # message("Skipping ${entry}") | |||||
| # set(skip TRUE) | |||||
| # else () | |||||
| message("Kernel: ${entry}") | |||||
| # endif () | |||||
| endif() | |||||
| # Skip the rest of the block if necessary | |||||
| if(NOT skip) | |||||
| # Registers | |||||
| if (${entry} MATCHES "reg([ ]+)=([ ]+)([^ ]+)") | |||||
| set(entry "${CMAKE_MATCH_3}") | |||||
| message("Registers: ${entry}") | |||||
| endif() | |||||
| # Local memory | |||||
| if (${entry} MATCHES "lmem([ ]+)=([ ]+)([^ ]+)") | |||||
| set(entry "${CMAKE_MATCH_3}") | |||||
| message("Local: ${entry}") | |||||
| endif() | |||||
| # Shared memory | |||||
| if (${entry} MATCHES "smem([ ]+)=([ ]+)([^ ]+)") | |||||
| set(entry "${CMAKE_MATCH_3}") | |||||
| message("Shared: ${entry}") | |||||
| endif() | |||||
| if (${entry} MATCHES "^}") | |||||
| message("") | |||||
| endif() | |||||
| endif() | |||||
| endforeach() | |||||
| endif() | |||||
| endforeach() | |||||
| else() | |||||
| # message("FOUND NO DEPENDS") | |||||
| endif() | |||||
| @@ -0,0 +1,200 @@ | |||||
| # This code is licensed under the MIT License. See the FindBANG.cmake script | |||||
| # for the text of the license. | |||||
| # The MIT License | |||||
| # | |||||
| # License for the specific language governing rights and limitations under | |||||
| # Permission is hereby granted, free of charge, to any person obtaining a | |||||
| # copy of this software and associated documentation files (the "Software"), | |||||
| # to deal in the Software without restriction, including without limitation | |||||
| # the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||||
| # and/or sell copies of the Software, and to permit persons to whom the | |||||
| # Software is furnished to do so, subject to the following conditions: | |||||
| # | |||||
| # The above copyright notice and this permission notice shall be included | |||||
| # in all copies or substantial portions of the Software. | |||||
| # | |||||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||||
| # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||||
| # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||||
| # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |||||
| # DEALINGS IN THE SOFTWARE. | |||||
| ########################################################################## | |||||
| # This file runs the cncc commands to produce the desired output file along with | |||||
| # the dependency file needed by CMake to compute dependencies. In addition the | |||||
| # file checks the output of each command and if the command fails it deletes the | |||||
| # output files. | |||||
| # Input variables | |||||
| # | |||||
| # verbose:BOOL=<> OFF: Be as quiet as possible (default) | |||||
| # ON : Describe each step | |||||
| # | |||||
| # build_configuration:STRING=<> Typically one of Debug, MinSizeRel, Release, or | |||||
| # RelWithDebInfo, but it should match one of the | |||||
| # entries in BANG_HOST_FLAGS. This is the build | |||||
| # configuration used when compiling the code. If | |||||
| # blank or unspecified Debug is assumed as this is | |||||
| # what CMake does. | |||||
| # | |||||
| # generated_file:STRING=<> File to generate. This argument must be passed in. | |||||
| # | |||||
| # generated_cnbin_file:STRING=<> File to generate. This argument must be passed | |||||
| # in if build_cnbin is true. | |||||
| if(NOT generated_file) | |||||
| message(FATAL_ERROR "You must specify generated_file on the command line") | |||||
| endif() | |||||
| # Set these up as variables to make reading the generated file easier | |||||
| set(CMAKE_COMMAND "@CMAKE_COMMAND@") # path | |||||
| set(source_file "@source_file@") # path | |||||
| set(CNCC_generated_dependency_file "@CNCC_generated_dependency_file@") # path | |||||
| set(cmake_dependency_file "@cmake_dependency_file@") # path | |||||
| set(BANG_make2cmake "@BANG_make2cmake@") # path | |||||
| set(BANG_parse_cnbin "@BANG_parse_cnbin@") # path | |||||
| set(build_cnbin @build_cnbin@) # bool | |||||
| set(BANG_HOST_COMPILER "@BANG_HOST_COMPILER@") # path | |||||
| # We won't actually use these variables for now, but we need to set this, in | |||||
| # order to force this file to be run again if it changes. | |||||
| set(generated_file_path "@generated_file_path@") # path | |||||
| set(generated_file_internal "@generated_file@") # path | |||||
| set(generated_cnbin_file_internal "@generated_cnbin_file@") # path | |||||
| set(BANG_CNCC_EXECUTABLE "@BANG_CNCC_EXECUTABLE@") # path | |||||
| set(BANG_CNCC_FLAGS @BANG_CNCC_FLAGS@ ;; @BANG_WRAP_OPTION_CNCC_FLAGS@) # list | |||||
| @BANG_CNCC_FLAGS_CONFIG@ | |||||
| set(cncc_flags @cncc_flags@) # list | |||||
| set(BANG_CNCC_INCLUDE_ARGS "@BANG_CNCC_INCLUDE_ARGS@") # list (needs to be in quotes to handle spaces properly). | |||||
| set(format_flag "@format_flag@") # string | |||||
| set(bang_language_flag @bang_language_flag@) # list | |||||
| if(build_cnbin AND NOT generated_cnbin_file) | |||||
| message(FATAL_ERROR "You must specify generated_cnbin_file on the command line") | |||||
| endif() | |||||
| # This is the list of host compilation flags. It C or CXX should already have | |||||
| # been chosen by FindBANG.cmake. | |||||
| @BANG_HOST_FLAGS@ | |||||
| # Take the compiler flags and package them up to be sent to the compiler via -Xcompiler | |||||
| set(cncc_host_compiler_flags "") | |||||
| # If we weren't given a build_configuration, use Debug. | |||||
| if(NOT build_configuration) | |||||
| set(build_configuration Debug) | |||||
| endif() | |||||
| string(TOUPPER "${build_configuration}" build_configuration) | |||||
| #message("BANG_CNCC_HOST_COMPILER_FLAGS = ${BANG_CNCC_HOST_COMPILER_FLAGS}") | |||||
| foreach(flag ${CMAKE_HOST_FLAGS} ${CMAKE_HOST_FLAGS_${build_configuration}}) | |||||
| # Extra quotes are added around each flag to help cncc parse out flags with spaces. | |||||
| set(cncc_host_compiler_flags ${cncc_host_compiler_flags} ${flag}) | |||||
| endforeach() | |||||
| # message("cncc_host_compiler_flags = ${cncc_host_compiler_flags}") | |||||
| # Add the build specific configuration flags | |||||
| list(APPEND BANG_CNCC_FLAGS ${BANG_CNCC_FLAGS_${build_configuration}}) | |||||
| # Remove the duplicated flags and including | |||||
| list(REMOVE_DUPLICATES BANG_CNCC_FLAGS) | |||||
| list(REMOVE_DUPLICATES BANG_CNCC_INCLUDE_ARGS) | |||||
| # bang_execute_process - Executes a command with optional command echo and status message. | |||||
| # | |||||
| # status - Status message to print if verbose is true | |||||
| # command - COMMAND argument from the usual execute_process argument structure | |||||
| # ARGN - Remaining arguments are the command with arguments | |||||
| # | |||||
| # BANG_result - return value from running the command | |||||
| # | |||||
| # Make this a macro instead of a function, so that things like RESULT_VARIABLE | |||||
| # and other return variables are present after executing the process. | |||||
| macro(bang_execute_process status command) | |||||
| set(_command ${command}) | |||||
| if(NOT "x${_command}" STREQUAL "xCOMMAND") | |||||
| message(FATAL_ERROR "Malformed call to bang_execute_process. Missing COMMAND as second argument. (command = ${command})") | |||||
| endif() | |||||
| if(verbose) | |||||
| execute_process(COMMAND "${CMAKE_COMMAND}" -E echo -- ${status}) | |||||
| # Now we need to build up our command string. We are accounting for quotes | |||||
| # and spaces, anything else is left up to the user to fix if they want to | |||||
| # copy and paste a runnable command line. | |||||
| set(bang_execute_process_string) | |||||
| foreach(arg ${ARGN}) | |||||
| # If there are quotes, excape them, so they come through. | |||||
| string(REPLACE "\"" "\\\"" arg ${arg}) | |||||
| # Args with spaces need quotes around them to get them to be parsed as a single argument. | |||||
| if(arg MATCHES " ") | |||||
| list(APPEND bang_execute_process_string "\"${arg}\"") | |||||
| else() | |||||
| list(APPEND bang_execute_process_string ${arg}) | |||||
| endif() | |||||
| endforeach() | |||||
| # Echo the command | |||||
| execute_process(COMMAND ${CMAKE_COMMAND} -E echo ${bang_execute_process_string}) | |||||
| endif() | |||||
| # Run the command | |||||
| execute_process(COMMAND ${ARGN} RESULT_VARIABLE BANG_result ) | |||||
| endmacro() | |||||
| # Delete the target file | |||||
| bang_execute_process( | |||||
| "Removing ${generated_file}" | |||||
| COMMAND "${CMAKE_COMMAND}" -E remove "${generated_file}" | |||||
| ) | |||||
| # cncc ignore host flags | |||||
| set(cncc_host_compiler_flags "") | |||||
| # Generate the code | |||||
| bang_execute_process( | |||||
| "Generating ${generated_file}" | |||||
| COMMAND "${BANG_CNCC_EXECUTABLE}" | |||||
| "${source_file}" | |||||
| ${bang_language_flag} | |||||
| ${format_flag} -o "${generated_file}" | |||||
| ${cncc_flags} | |||||
| ${cncc_host_compiler_flags} | |||||
| ${BANG_CNCC_FLAGS} | |||||
| -DCNCC | |||||
| ${BANG_CNCC_INCLUDE_ARGS} | |||||
| ) | |||||
| if(BANG_result) | |||||
| # Since cncc can sometimes leave half done files make sure that we delete the output file. | |||||
| bang_execute_process( | |||||
| "Removing ${generated_file}" | |||||
| COMMAND "${CMAKE_COMMAND}" -E remove "${generated_file}" | |||||
| ) | |||||
| message(FATAL_ERROR "Error generating file ${generated_file}") | |||||
| else() | |||||
| message(VERBOSE "Generated ${generated_file} successfully.") | |||||
| endif() | |||||
| # Cnbin resource report commands. | |||||
| if( build_cnbin ) | |||||
| # Run with -cnbin to produce resource usage report. | |||||
| bang_execute_process( | |||||
| "Generating ${generated_cnbin_file}" | |||||
| COMMAND "${BANG_CNCC_EXECUTABLE}" | |||||
| "${source_file}" | |||||
| ${BANG_CNCC_FLAGS} | |||||
| ${cncc_flags} | |||||
| ${cncc_host_compiler_flags} | |||||
| -DCNCC | |||||
| -cnbin | |||||
| -o "${generated_cnbin_file}" | |||||
| ${BANG_CNCC_INCLUDE_ARGS} | |||||
| ) | |||||
| # Execute the parser script. | |||||
| bang_execute_process( | |||||
| "Executing the parser script" | |||||
| COMMAND "${CMAKE_COMMAND}" | |||||
| -D "input_file:STRING=${generated_cnbin_file}" | |||||
| -P "${BANG_parse_cnbin}" | |||||
| ) | |||||
| endif() | |||||
| @@ -98,18 +98,27 @@ def eye(N, M=None, *, dtype="float32", device: Optional[CompNode] = None) -> Ten | |||||
| return result | return result | ||||
| def full(shape, value, dtype="float32", device=None) -> Tensor: | |||||
| def full( | |||||
| shape: Union[int, tuple, list], | |||||
| value: Union[bool, int, float, Tensor], | |||||
| dtype=None, | |||||
| device=None, | |||||
| ) -> Tensor: | |||||
| r"""Creates a tensor of shape ``shape`` filled with ``value``. | r"""Creates a tensor of shape ``shape`` filled with ``value``. | ||||
| Args: | Args: | ||||
| shape: a list, tuple or integer defining the shape of the output tensor. | |||||
| value: the value to fill the output tensor with. | |||||
| dtype: the desired data type of the output tensor. Default: ``float32``. | |||||
| device: the desired device of the output tensor. Default: if ``None``, | |||||
| use the default device (see :func:`~.megengine.get_default_device`). | |||||
| shape: output tensor shape. | |||||
| value: fill value. | |||||
| dtype: output tensor data type. If ``dtype`` is ``None``, the output tensor | |||||
| data type must be inferred from ``value``. If the value is an ``int``, | |||||
| the output tensor data type must be the default integer data type. If the | |||||
| value is a ``float``, the output tensor data type must be the default | |||||
| floating-point data type. If the value is a ``bool``, the output tensor | |||||
| must have boolean data type. Default: ``None``. | |||||
| device: device on which to place the created tensor. Default: ``None``. | |||||
| Returns: | Returns: | ||||
| output tensor. | |||||
| a tensor where every element is equal to ``value``. | |||||
| Examples: | Examples: | ||||
| @@ -41,6 +41,14 @@ def test_eye(): | |||||
| ) | ) | ||||
| def test_full(): | |||||
| shape = (2, 3) | |||||
| values = [True, 4, 5.0] | |||||
| for value in values: | |||||
| np.testing.assert_allclose(F.full(shape, value).numpy(), np.full(shape, value)) | |||||
| assert F.full(shape, value).dtype == tensor(value).dtype | |||||
| @pytest.mark.parametrize("is_varnode", [True, False]) | @pytest.mark.parametrize("is_varnode", [True, False]) | ||||
| def test_concat(is_varnode): | def test_concat(is_varnode): | ||||
| if is_varnode: | if is_varnode: | ||||