WO2012039937A2 - Systems and methods for compiler-based vectorization of non-leaf code - Google Patents

Systems and methods for compiler-based vectorization of non-leaf code Download PDF

Info

Publication number
WO2012039937A2
WO2012039937A2 PCT/US2011/050713 US2011050713W WO2012039937A2 WO 2012039937 A2 WO2012039937 A2 WO 2012039937A2 US 2011050713 W US2011050713 W US 2011050713W WO 2012039937 A2 WO2012039937 A2 WO 2012039937A2
Authority
WO
WIPO (PCT)
Prior art keywords
function
dependency
compiler
vector
calling
Prior art date
Application number
PCT/US2011/050713
Other languages
English (en)
French (fr)
Other versions
WO2012039937A3 (en
Inventor
Jeffry E. Gonion
Original Assignee
Apple Inc.
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Priority claimed from US12/888,644 external-priority patent/US8621448B2/en
Priority claimed from US12/888,658 external-priority patent/US8949808B2/en
Application filed by Apple Inc. filed Critical Apple Inc.
Priority to AU2011305837A priority Critical patent/AU2011305837B2/en
Priority to DE112011103190T priority patent/DE112011103190T5/de
Priority to KR1020137010386A priority patent/KR101573586B1/ko
Priority to MX2013003339A priority patent/MX2013003339A/es
Priority to BR112013008640A priority patent/BR112013008640A2/pt
Priority to CN201180045583.4A priority patent/CN103119561B/zh
Priority to TW100134227A priority patent/TWI446267B/zh
Publication of WO2012039937A2 publication Critical patent/WO2012039937A2/en
Publication of WO2012039937A3 publication Critical patent/WO2012039937A3/en

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456Parallelism detection

Definitions

  • This disclosure relates to computer systems, and, more particularly, to systems and methods for enabling the universal vectorization of software applications.
  • a computer programmer writes source code in a high-level programming language (e.g., Basic, C++, etc).
  • a compiler to transform the source code into object code.
  • executable code e.g., after linking or other compile-time or run-time processing
  • the resulting object code can then be executed by a computer or computing device.
  • the compiler analyzes a software function to determine if there are any obstacles to vectorization.
  • One such obstacle for example, is the presence of a true data dependency. This happens when a present instruction refers to the data obtained through the execution of a preceding instruction. In that case, the latter instruction can only be carried out after the former, and therefore the two instaictions cannot be executed in parallel.
  • Another potential obstacle is the presence of a function call. For instance, if a function to be compiled makes a call to an external function, then the compiler may not be able to vectorize the calling function ,
  • the present disclosure provides systems and methods for enabling the universal vectorization of software applications. To that end, systems and methods disclosed herein provide the expression of dependencies and/or interfaces that extend a compiler's ability to vectorize functions.
  • a compiler may examine memory and/or data dependencies within a function (a "called function") during its compilation, and express those dependencies in a dependency database, such as, e.g., a dependency file.
  • a dependency database such as, e.g., a dependency file.
  • the called function may become, for example, a library function or the like.
  • another function a "calling function”
  • the compiler may access the dependency file associated with the called function and may identify its dependencies. Based on the called function's dependencies, the compiler can make a decision as to whether to vectorize the calling function.
  • the compiler may decide to vectorize only a portion of the calling function.
  • the visibility provided by the use of dependency files may allow the compiler to vectorize a higher percentage of functions than would otherwise be possible.
  • dependency files allows the vectorization of functions that include non-leaf loops—i.e. , loops that make calls to external functions for which source code is not visible. Because the vast majority of software functions today include one or more non-leaf loops, these systems and methods can increase the amount of vectorization that can be applied to any application.
  • a compiler may generate both scalar and vector versions of a function from a single source code description.
  • a scalar version of the function may use a scalar interface as originally specified by the source code.
  • a vector version of the function may implement a vector interface to the function, accepting vector parameters and generating vector return values.
  • the vector interface may be exposed in the dependency file associated with the function.
  • This alternative vector interface allows the compiler to make vector function calls from within vectorized loops, for example, rather than making multiple serialized scalar function calls from within a vectorized loop.
  • FIG. 1 is a block diagram illustrating a computer system operable to implement techniques for enabling universal vectorization of software applications according to certain embodiments.
  • FIG. 2 is a block diagram illustrating a compiler that, when executed by a computer system, may generate executable code according to certain embodiments.
  • FIG. 3 shows a flow diagram illustrating a method of expressing a dependency in a dependency database according to certain embodiments.
  • FIG. 4 shows a flow diagram illustrating a method of vectorizing a function according to certain embodiments.
  • FIG. 5 shows a flow diagram illustrating a full function vectorization method according to certain embodiments.
  • FIG. 6 shows a flow diagram illustrating a method of using a vectorized function according to certain embodiments.
  • the following specification first discusses an illustrative computer system or device.
  • the specification also describes an illustrative compiler that may be configured to execute and/or generate executable code for the computer system. Then, the specification presents several techniques for enabling non-leaf loop and full function vectorization.
  • FIG. 1 depicts an illustrative computer system operable to implement techniques for enabling universal vectorization of software applications according to certain embodiments.
  • computer system 100 includes one or more processors 110a- 1 1 On coupled to memory 120 via I/O interface 130.
  • Computer system 100 also includes network interface 140 and storage interface 150 coupled to I/O interface 130.
  • Storage interface 150 connects external storage device 155 to I/O interface 130.
  • network interface 140 may connect system 100 to a network (not shown) or to another computer system (not shown).
  • computer system 100 may be a single processor system including only one processor 1 10a. In other embodiments, computer system 100 may include two or more processors 110a- 1 10 ⁇ .
  • Processors 1 10a- 1 lOn may include any processor capable of executing instructions.
  • processors HOa-l lOn may be general-purpose or embedded processors implementing any suitable instruction set architectures (ISAs), such as, for example, the x86, PowerPCTM, SPARCTM, or MIPSTM ISAs.
  • processors 1 10a- 1 10 ⁇ may include various features of the Macroscalar processors described in U.S. Patent No. 7,617,496 and U.S. Patent No. 7,395,419.
  • System memory 120 may be configured to store instructions and data accessible by processors 110a- 11 On,
  • system memory 120 may be as static random access memory (SRAM), synchronous dynamic RAM (SDRAM), nonvolatile/FSash-type memory, or any other any suitable type of memory technology.
  • SRAM static random access memory
  • SDRAM synchronous dynamic RAM
  • a portion of the program instructions and/or data implementing desired functions or applications described in detail below may be shown stored within system memory 120. Additionally or alternatively, a portion of those program instructions and/or data may be stored in storage device 155, in a cache memory within one or more processors 1 lOa-l lOn, or may arrive from a network via network interface 140.
  • I/O interface 130 is operable to manage data traffic between processors U Oa-l lOn, system memory 120, and any device in or attached to the system, including network interface 140, storage interface 1 0 or other peripheral interfaces.
  • I/O interface 130 may convert data or control signals from one component into a format suitable for use by another component.
  • I/O interface 130 may include support for devices attached through various types of peripheral buses, such as the Peripheral Component Interconnect (PCI) bus or the Universal Serial Bus (USB), for example.
  • PCI Peripheral Component Interconnect
  • USB Universal Serial Bus
  • some or all of the functionality of I/O interface 130 may be incorporated into processors 110a- 11 On.
  • Network interface 140 is configured to allow data to be exchanged between computer system 100 and other devices attached to a network, such as other computer systems, for example.
  • network interface 140 may support communication via wared or wireless general data networks, telecommunications/telephony networks, storage area networks such as Fibre Channel SANs, and the like.
  • Storage interface 150 is configured to allow computer system 100 to interface with a storage device such as storage device 155.
  • Storage interface 150 may support standard storage interfaces such as one or more suitable versions of the Advanced Technology Attachment Packet Interface (AT API) standard (which may also be referred to as Integrated Drive Electronics (IDE)), the Small Computer System Interface (SCSI) standard, the IEEE 1394 "Firewire” standard, the USB standard, or another standard or proprietary interface suitable for interconnecting a mass storage device with computer system 100.
  • AT API Advanced Technology Attachment Packet Interface
  • SCSI Small Computer System Interface
  • IEEE 1394 Firewire
  • USB USB standard
  • storage device 155 may include magnetic, optical or solid state media that may be fixed or removable.
  • Storage device 155 may also correspond to a hard disk drive or drive array, a CD or DVD drive, or a nonvolatile memory (e.g., Flash)-based device.
  • System memory 120 and storage device 155 represent illustrative embodiments of a computer-accessible or computer-readable storage medium configured to store program instructions and data.
  • program instructions and/or data may be received, sent or stored upon different types of computer-accessible media.
  • a computer- accessible medium or storage medium may include any type of mass storage media or memory media such as magnetic or optical media.
  • a computer-accessible medium or storage medium may also include any volatile or non-volatile media such as RAM (e.g. SDRAM, DDR SDRAM, RDRAM, SRAM, etc.), ROM, or the like, whether included in computer system 100 as system memory 120 or another type of memory.
  • Program instructions and data stored via a computer- accessible medium may be transmitted by transmission media or signals such as electrical, electromagnetic, or digital signals, which may be conveyed via a communication medium such as a network and/or a wireless link, such as may be implemented via network interface 140.
  • transmission media or signals such as electrical, electromagnetic, or digital signals, which may be conveyed via a communication medium such as a network and/or a wireless link, such as may be implemented via network interface 140.
  • computer system 100 may take the form of a desktop or laptop computer.
  • computer system 100 may be any suitable device capable of executing software.
  • computer system 100 may be a tablet computer, a phone, or the like.
  • a compiler may correspond to a software application (e.g., one or more modules of computer-executable instructions) that is configured to translate or transform source code, which may be represented in a high-level programming language such as C, C++ or any other suitable programming language, into object code.
  • the language in which the source code is expressed may be referred to as the source code language or simply the source language.
  • object code may be represented in the form of instructions and data suitable for processing by a target computing architecture, although in some embodiments, additional processing (e.g., linking) may be performed on generated object code to transform object code into machine-executable code. In various embodiments, such additional processing may be performed by a compiler or by separate applications.
  • Object code may be represented in machine-readable form (e.g., binary form), in human-readable form (e.g., assembly language) that may require additional processing to generate machine-readable code, or in a combination of human- and machine-readable forms.
  • the target architecture for the object code may be the same as the ISA implemented by processors 1 10a- 1 1 On on which the compiler is configured to execute. However, in some instances, a compiler may be configured to generate object code for a different ISA than the ISA on which the compiler executes fa "cross-compiler").
  • FIG. 2 depicts an illustrative compiler that, when executed by computer system 100 or another suitable computer system, may generate executable code according to certain embodiments.
  • Compiler 200 includes front end 220 and back end 230, which may in turn include optimizer 240 and code generator 250. As shown, front end 220 receives source code 210 and back end 230 produces object code such as, for example, scalar object code 260, vectorized object code 270, or a combination thereof. Compiler 200 may also produce dependency database 280 associated with one or more of object codes 260 and/or 270.
  • source code 210 is typically written in a high-level programming language
  • source code 210 may alternatively correspond to a machine-level language such as assembly language.
  • compiler 200 may be configured to apply its optimization techniques to assembly language code in addition to code written in higher-level programming languages.
  • compiler 200 may include a number of different instances of front end 220, each configured to process source code 210 written in a different respective language and to produce a similar intermediate representation for processing by back end 230. In such embodiments, compiler 200 may effectively function as a multi-language compiler.
  • front end 220 may be configured to perform preliminary processing of source code 210 to determine whether the source is lexically and/or syntactically correct, and to perform any transformation suitable to ready source code 210 for further processing by back end 230.
  • front end 220 may be configured to process any compiler directives present within source code 210, such as conditional compilation directives that may result in some portions of source code 210 being included in the compilation process while other portions are excluded.
  • Front end 220 may also be variously configured to convert source code 210 into tokens (e.g., according to whitespace and/or other delimiters defined by the source language), determine whether source code 210 includes any characters or tokens that are disallowed for the source language, and determine whether the resulting stream of tokens obeys the rules of syntax that define well-formed expressions in the source language.
  • front end 220 may be configured to perform different combinations of these processing activities, may omit certain actions described above, or may include different actions, depending on the implementation of front end 220 and the source language to which front end 220 is targeted.
  • front end 220 may omit a processing action that includes scanning source code 210 for compiler directives.
  • front end 220 may abort processing and report the errors (e.g., by writing error information to a log file or to a display). Otherwise, upon sufficiently analyzing the syntactic and semantic content of source code 210, front end 220 may provide a intermediate representation of source code 210 to back end 230.
  • this intermediate representation may include one or more data structures that represent the structure and semantic content of source code 210, such as syntax trees, graphs, symbol tables or other suitable data stnictures.
  • the intermediate representation may be configured to preserve information identifying the syntactic and semantic features of source code 210, and may also include additional annotation information generated through the parsing and analysis of source code 210.
  • the intermediate representation may include control flow graphs that explicitly identify the control relationships among different blocks or segments of source code 210.
  • Such control flow information may be employed by back end 230 to determine, for example, how functional portions of source code 210 may be rearranged (e.g., by optimizer 240) to improve performance while preserving necessary execution-ordering relationships within source code 210.
  • Back end 230 may generally be configured to transform the intermediate representation into one or more of scalar code 260, vectorized code 270, or a combination of both.
  • optimizer 240 may be configured to transform the intermediate representation in an attempt to improve some aspect of the resulting scalar code 260 or vectorized code 270.
  • optimizer 240 may be configured to analyze the intermediate representation to identify memory or data dependencies.
  • optimizer 240 may be configured to perform a variety of other types of code optimization such as vectorization, loop optimization (e.g., loop fusion, loop unrolling, etc.), data flow optimization (e.g., common subexpression elimination, constant folding, etc.), or any other suitable optimization techniques.
  • Optimizer 240 may also be configured to generate dependency database 280.
  • dependency database 280 may express an indication of a memory and/or data dependency within source code 210. Additionally or alternatively, in connection with the vectorization of source code 210, dependency database 280 may expose a vector interface associated with vectorized object code 270.
  • Code generator 250 may be configured to process the intermediate representation, as transformed by optimizer 206, in order to produce scalar code 260, vectorized code 270, or a combination of both types of code.
  • code generator 250 may be configured to generate vectorized machine instructions defined by the ISA of the target architecture such that execution of the generated instructions by a processor implementing the target architecture ⁇ e.g., one of processors 110a- 11 On, or a different processor) may implement the functional behavior specified by source code 210.
  • code generator 250 may also be configured to generate instructions corresponding to operations that may not have been inherent in source code 210, but which may have been added by optimizer 240 during the optimization process.
  • compiler 200 may be partitioned into more, fewer or different components than those shown.
  • compiler 200 may include a linker (not shown) configured to take one or more object files or libraries as input and combine them to produce a single— usually executable— file.
  • the linker may be an entity separate from compiler 200.
  • any of the components of compiler 200, and any of the methods or techniques performed thereby including those described below with respect to FIGs. 3-6, may be implemented partially or entirely as software code stored within a suitable computer- accessible storage medium.
  • Source code 210 may represent, for example, a software function or algorithm.
  • the resulting object code 260 and/or 270 may be, for example, a library or external function that can be called by other functions.
  • Illustrative techniques employed by compiler 200 during operation, and in particular during its vectorization operation, are discussed in more detail below.
  • vector computing (which may be considered to be a special case of parallel computing) allows a computer to attempt to execute a single mstruction that operates on multiple data items at once.
  • SIMD single instruction, multiple data
  • Various examples of vector computing can be found in the single instruction, multiple data (SIMD) instruction sets now available in various processors, including, for example, IBM's AltiVecTM and SPETM instruction set extensions for PowerPCTM_processors and Intel's variants of MMXTM and SSETM mstruction set extensions.
  • SIMD instructions are examples of vector instructions that may be targeted by a vectorizing compiler, although other types of vector instructions or operations (including variable-length vector operations, predicated vector operations, vector operations that operate on combinations of vectors and scalars/immediates) are also possible and contemplated.
  • vectorization When performed using a compiler (as opposed to, for example, vectorizing source code by hand), vectorization may be referred to as “compiler auto- vectorization.”
  • compiler auto-vectorization One particular type of auto-vectorization is loop auto-vectorization.
  • Loop auto- vectorization may convert procedural loops that iterate over multiple data items into code that is capable of concurrently processing multiple data items within separate processing units (e.g., processors 1 10a- 11 On of computer system 100 in FIG. 1 , or separate functional units within a processor).
  • a procedural loop may iterate through the arrays, adding a pair of array elements during each iteration.
  • a vectorizing compiler might take advantage of the fact that the target processor implements vector operations capable of concurrently processing a fixed or variable number of vector elements, For example, the compiler might auto-vectorize the array-addition loop so that at each iteration, multiple elements of arrays A[] and B[] are concurrently added, reducing the number of iterations needed to complete the addition.
  • a typical program spends a significant amount of its execution time within such loops. As such, auto-vectorization of loops can generate performance improvements without programmer intervention.
  • compiler auto-vectorization is limited to leaf loops— i.e., loops that do not make calls to other functions.
  • compiler 200 may determine whether function fooQ interacts with (e.g., reads or writes) array A[],
  • function fooQ does not interact with A[]
  • function fooQ does interact wit A[j
  • function fooQ might interact with A[j (e.g., depending on a compile-time or run-time condition, fooQ may or may not interact with ,4/7).
  • a dependency database which may also be referred to herein as a "persistent dependency database,” may describe the dependencies of externally callable functions in a library. That is, a dependency database may expose to a calling function various dependencies of a called function that are not necessarily apparent from the called function's interface alone. This database may be accessed when functions that call a library are compiled. Generally speaking, a dependency database may persistently store indications of the dependencies of callable code such that the dependencies are visible across compiler invocations.
  • a dependency database may be implemented as a dependency file (analogous to a header file) tha includes human-readable and/or machine-readable content indicative of various dependencies.
  • a dependency database may be implemented using other techniques, such as by using a table-based relational database, semi -structured data (e.g., formatted using Extensible Markup Language (XML)), or any other suitable technique.
  • XML Extensible Markup Language
  • the following discussion makes reference to an embodiment that employs a dependency file.
  • this is merely an non-limiting example of a dependency database.
  • compiler 200 automatically accesses a dependency file (if it exists) upon inclusion of a corresponding header file (e.g., stdHb.h).
  • This mechanism may allow vectorizing compilers such as, for example, Macroscalar compilers to compile existing code without modification while having the advantage of knowing the dependencies of external libraries. Compiler 200 may then generate dependency files automatically when libraries are compiled.
  • Information contained in a dependency file may form an Application Compiler Interface (ACI) that provides information which compiler 200 can use to understand the constraints of a function.
  • dependency files may express information about variables that are not normally within the scope of a calling function.
  • the variables expressed in a dependency file may include data items that are not parameters of the called function (that is, such variables may not be defined by a called function's programming interface as parameters of the called function).
  • a calling function may become aware of whether a called function reads or writes fu ction- static or file-static variables, for example.
  • Dependency files may also allow compiler 200 to differentiate between variables tha share the same name but have different scopes.
  • compiler 200 may also generate dependency file stdlib, d, for example, at compile-time.
  • Dependency file stdlib. d exposes memory dependencies associated with public functions defined in stdHb.h.
  • Other programs that include stdHb.h from their source code may trigger compiler 200 to search for the associated dependency file stdlib. d in corresponding locations.
  • This dependency file may be distributed and installed along with stdlib. h and stdlib. o.
  • the absence of a dependency file would mean that no additional information about the library is available, which might be the default state for legacy libraries and would not cause any compile errors.
  • Dependency databases may enable vectorization of non-leaf loops by exposing the data dependency characteristics of a previously-compiled library function (or any function in a program) in a manner that is visible to compiler 200 when the code that calls the library function is compiled. This information may be made available without revealing the source-code for the library.
  • the dependency information may be generated at compile-time of the library. For example, for each function that is compiled, compiler 200 may note the types of accesses to function static variables, file static variables, global variables, and/or pointers passed in to the function being compiled. Compiler 200 may then record which symbols were read or written, and export this information in the form of a dependency file that can be accessed and used at the compile-time of other code that references the library.
  • function foo() is defined in file foo.c and its interface is defined in the header file foo.h
  • the memory dependency characteristics of function foo() may be stored into dependency file foo.hd.
  • a calling function that uses function fooQ may include header file foo.h, but may ha ve no access to file foo.c.
  • compiler 200 may automatically search for the dependency file foo.hd to see whether it exists.
  • dependency file foo.hd Because the existence of dependency file foo.hd is optional, the absence of this file may imply that the dependency characteristics of functions defined in file foo.h are unknown, thus suggesting compiler 200 should make pessimistic assumptions when vectorizing the calling function. If the dependency file exists, however, compiler 200 can use the dependency information in this file to make more accurate and aggressive assumptions using the dependency characteristics contained therein during vectorization of the calling function.
  • compiler 200 receives a function to be compiled.
  • compiler 200 may receive the function when processing source code for compilation, such as during compilation of a library that includes the function.
  • compiler 200 analyzes the function and identifies an expressed dependency within the function.
  • This expressed dependency may be, for example, a memory' or data dependency associated with a data item that is not a parameter of the called function. More generally, an expressed dependency of a function with respect to a particular data item may indicate whether the function only reads the particular data item, only writes the particular data item, or both reads and writes the particular data item.
  • analysis of the function may include activities such as performing a lexical, syntactic, and/or semantic analysis of the function. Analysis may also include generating a parse tree, symbol table, intermediate- code representation, and/or any other suitable data structure or representation that is indicative of some aspect of the operations and/or data references of the code being compiled.
  • compiler 200 stores an indication of the expressed dependency in a dependency database associated with the function. For example, during analysis of the function, compiler 200 may identify variables used by the function that are not necessarily local or private to that function, and thus are capable of being read or written by code that is external to the function. Such variables may be examples of expressed dependencies that compiler 200 might identify, and compiler 200 may store indications of these variables within a dependency database. (It is noted that in some embodiments, compiler 200 may also identify and indicate dependencies that are local or private to the function.) In various embodiments, the indication of an expressed dependency may include information that identifies the expressed dependency, such as a name of the variable depended upon.
  • the indication may also include information that characterizes the expressed dependency, such as information regarding whether the function reads or writes the variable, and/or information regarding the data type or scope of the variable (e.g., whether the variable is global, private, static, etc.).
  • the dependency file may be created or updated in any suitable format such as, for example, Extensible Markup Language (XML), or the like.
  • XML Extensible Markup Language
  • dependencies may be indicated in a negative fashion instead of or in addition to an affirmative fashion.
  • a dependency file may explicitly indicate that a given variable is not dependent on external code, in addition to or instead of indicating those expressed dependencies that do exist.
  • compiler 200 identifies a calling function.
  • the calling function may include a non-leaf loop, in which case the calling function may include a call to an external or called function.
  • compiler 200 may process the funcl.c source code and identify the f ncl() function as a calling function that includes a non-leaf for loop that calls the fool () function,
  • compiler 200 may attempt to access a dependency database associated with the called function.
  • a dependency database e.g., a dependency file
  • compiler 200 may attempt to infer the name of a dependency file from other data according to a naming convention. For example, if a header file is included within source code, compiler 200 may search for a dependency file that is derived from the name of the header file. In some embodiments, compiler 200 may search for dependency files based on the name of the called function.
  • dependency database may indicate an expressed dependency within the called function.
  • This expressed dependency may be, for example, a memory or data dependency associated with an da ta item that is not a parameter of the called function, as discussed abo ve.
  • compiler 200 may check a number of different naming conventions to determine whether or not a dependency file exists.
  • compiler 200 determines whether the calling function interacts with the called function based, at least in part, on the expressed dependency (or the absence of a dependency). For example, upon accessing the dependency file associated with function foolO, compiler 200 may determine that fool() depends on variable "e” but not variables "A” or "F.” Thus, compiler 200 may determine that calling function funclQ does interact with called function fool (J, at least with respect to variable "e.”
  • compiler 200 may determine whether to vectorize at least a portion of the calling function. For example, based on the expressed dependency information discussed above, compiler 200 may attempt to vectorize calling function funclQ, by generating vector code that concurrently operates on multiple data items (e.g., array elements) and/or multiple loop iterations.
  • a dependency database may express various types of information that may be useful to compiler 200 in determining whether to vectorize a function. Examples include tracking reads and writes to data objects, pointers, pointed-to data objects, known offsets within pointed-to objects, unknown offsets into pointed-to objects (which may effectively constitute a reference to the entire object), variable offsets within objects (both pointed-to and data objects, which may enable run-time dependency analysis using the variable in question), and known offsets into objects of unknown offset into a higher-level object (e.g., when an unknown number of known offsets are referenced, but other offsets remain unreferenced).
  • Known offset information may enable compiler 200 to vectorize without generating additional dependency-checking instructions, while variable offset information may be used to generate dependency-checking instructions thai analyze the variable dependencies at run-time, which may allow increased vector parallelism to be achieved while still maintaining program correctness.
  • a dependency database may express information about a called function that is useful to compiler 200 when vectorizing a calling function.
  • a dependency database may store information such as the type of memory access, the addressing mode, and/or additional qualifiers.
  • memory accesses by a function generally fall into two types: reads and writes.
  • a dependency database may explicitly store indications of whether a data item is read or written.
  • Addressing modes describe memory accesses within a called function as viewed by the calling function.
  • Some embodiments may define three addressing modes: constant, variable, and unknown, though alternative embodiments are possible and contemplated. Each of these three addressing modes may be determined by whether addressing can be established by the compiler at compile time, by the calling function at run time, or by the called function at run time, respectively.
  • some embodiments may define two orthogonal qualifiers to the addressing modes: public and private. These designate whether the associated variable is visible to external modules.
  • constant addressing describes addressing that can be resolved from outside the module at compile time.
  • g a named variable
  • str.g a named structure element within a named structure
  • h[5] an array indexed by a constant
  • str[5].h a named structure element within a named array of structures indexed by a constant
  • These examples can represent either static or global variables. (Automatic storage is usually temporal for example, allocated upon entry to a module and deallocated upon the module's exit— and thus not generally visible outside of the module,)
  • function foo void
  • variable addressing describes addressing that is not constant but also not modified by the called function. Therefore, it may be evaluated by the calling function at run time, Examples include references to pomted-to objects and to arrays where the addressing may be observed by the calling function.
  • static int A [ 1000 ] ; / ' . / file- static variable, not exported void assigriA ( int g, int. x)
  • a [g] A[x] ;
  • This function would export the following dependencies to the dependency file, declaring that the function writes Afgj and reads A fx]— -both variably- addressed arrays: void assigiiA (g, x)
  • dependency checking (which may also be referred to as hazard checking) may be unnecessary if the function assignAQ is called only once per iteration of the calling loop.
  • the called function assignAQ may determine whether g and x overlap and may partition the vector accordingly, for example, using Macrosca!ar techniques.
  • assignA (gl , x) ;
  • unknown addressing is similar to variable addressing as described above, but typically applies to situations where the run-time addressing cannot be evaluated by the calling function. This may happen, for example, in situations where the called function modifies the values of address variables in a manner that is not visible to the calling function using information from the dependency file.
  • Additional qualifiers "public” and “private” may designate whether a linker exports a symbol to allow the variable to be inspected by calling functions. For example, the references to A [J in the next to last example given above are designated “private," because Afj is declared as a file-static variable not exported to functions that call assign AQ. In this example, compiler 200 can determine from the dependency information how the assignAQ function addresses A[] but may not be able to generate code that actually reads values oiAfJ.
  • compiler auto-vectorization may be employed to generate vectorized code from nonvectorized source code in a manner that may be transparent to programmers or other users. Such compiler auto-vectorization may enable source code to take advantage of performance improvements offered by vector computing hardware with little or no programmer intervention.
  • non-leaf functions i.e., functions that call other functions
  • an application developer might wish to target an application to a variety of computing platforms, not all of which may offer vector resources.
  • a mobile version of a processor family might omit vector operations to reduce die size and power consumption, whereas a desktop version of the same processor family might be developed to emphasize processing power over power consumption.
  • an application in order to execute on the mobile processor, an application might need to be compiled using only scalar functions, whereas the application might use either scalar or vector functions when executing on the desktop processor.
  • a compiler when vectorizing a function, may generate both scalar and vector versions of the function from a single source code description.
  • the function may be, for example, a library function, though more generally, it may correspond to any callable procedure or method.
  • the scalar version of the function may use a scalar interface as originally specified by the source code.
  • the vector version of the function may implement a vector interface to the function, accepting vector parameters and/or generating vector return values.
  • the compiler may enable code to be more flexibly tailored to the available resources, either at compile or run time.
  • the compiler may facilitate the vectorization of calling functions, thus propagating opportunities for vectorization hierarchically upwards from leaf functions.
  • the vector interface may be expressed, for example, in a dependency database associated with the function, such as a dependency file.
  • a dependency database associated with the function
  • a dependency file For example, consider the following function shell, in which internal details of the function have been omitted: int foo ( int A)
  • a scalar interface for this function may be represented (e.g., within a dependency file) as: int foo ( int. A)
  • Vector foo Vector A
  • a vector interface for this function may be represented (e.g., within a dependency file) as:
  • Vector foo Vector A
  • this representation indicates that this version of fooQ takes a vector parameter and returns a vector result.
  • compiler 200 receives a function to be compiled.
  • compiler 200 may compile a scalar version of the i unction.
  • compiler 200 may compile a vector version of the function.
  • compiler 200 may express a vector interface associated with the v ector version of t he function in a dependency database.
  • lifooQ had only a scalar interface, the opportunities for vectorizing this loop might be limited, e.g., to vectorization of the assignment.
  • the presence of a vector version of fooQ may increase opportunities for loop vectorization.
  • a vectorized version of the above loop might call foo() using vector parameters and might receive vector results, enabling more concurrent execution and reducing serialization within the loop.
  • this technology permits the vectorization of functions that do not contain loops. This may increase the amount of overall vectorization in applications.
  • Loops in both versions of a function may be vectorized.
  • horizontal vectorization may refer to a type of vectorization in which iterations of a loop are mapped to corresponding elements of a vector.
  • Very vectorization may refer to a type of vectorization in which the iterative nature of a loop may be preserved (i.e., as opposed to being mapped to vector elements as in horizontal vectorization), but in which scalar variables are replaced with vector variables, such that each iteration concurrently operates on more data than the scalar version of t he code.
  • Loops in the scalar version of the function can be vectorized horizontally using Macroscalar techniques, while loops in the vector v ersion of the function can be vectorized either horizontally or vertically. This may increase the opportunities for vectorization in applications, in addition to the performance and efficiency benefits of vectorizing function calls, this technology may increase the number of loops that are vertically vectorized in an application, thus reducing the overhead caused when loops are horizontally vectorized.
  • compiler 200 identifies a calling function that makes a call to called function.
  • the calling function may include a loop that makes the call to a function within a pre-compiled library.
  • compiler 200 accesses a dependency database associated with the called function.
  • compiler 200 checks the dependency database to determine whether a vector variant of the called function is available. In one implementation, when the vector version is available, compiler 200 compiles the calling function to utilize the vector variant of the called function in block 630, If the vector version is
  • compiler 200 compiles the calling function to utilize the scalar version (e.g., by iteratively calling the scalar version of the function).
  • the compiler may check a dependency database associated with foo() to determine whether a vector interface associated with foof) exists. If fooQ's vector interface does not exist, then compiler 200 may only partially vectorize the loop, for example by vectorizing the assignment while leaving the function call in a scalar format.
  • compiler 200 may vectorize the loop in its entirety (e.g., by replacing or otherwise transforming both the assignment and the function call into vector operations).
  • the compiler may additionally or alternatively examine any memory dependencies associated with the called function that may be expressed the same (or another) dependency database associated with JboQ.
  • addressing for each dimension of an array may be tracked independently to minimize uncertainty.
  • This concept may apply to ail aggregate data types in general, such as stnictures and arrays.
  • the following example illustrates in greater detail how a compiler, such as compiler 200, for example, may use dependency database information to enable vectorization, and may employ vector versions of functions in place of scalar versions when possible (it being noted that in other embodiments, a dependency database may be used independently of determining whether vector function interfaces exist, and vice versa). typedef struct
  • function bar() would export dependencies ⁇ e.g., via a dependency file generated by compiler 200 when function bar() is compiled, as discussed above) indicating that it writes to p.ptrf], and reads from p.b and , /:
  • compiler 200 may compile function barf) without vectorizing it because there is no loop over which to vectorize. In doing so, it may produce a scalar version of barf) having the following interface: int bar (myStruct *p , int j ⁇
  • bar() may take a single instance of a pointer to a structure and a single integer as parameters, and return a single integer as a result.
  • this version of barQ is scalar in its inputs and outputs.
  • compiler 200 may also compile a vector function, with the following interface that can also be exported in the dependency database: Vector bar (Vector p , Vector j , Vector pred)
  • the predicate vector pred designates which vector elements should be processed by this function.
  • a predicate vector may contain a vector having the same defined number of bits, each bit corresponding to a respective element, Each bit may serve as a Boolean predicate that determines whether its corresponding vector element should be processed (e.g., "yes” if the predicate bit is " ⁇ ' and "no” if it is "0,” or vice versa).
  • Predicates allow the calling function to make conditional function calls and takes care of the tail of the loop if it does not terminate on a vector-length boundary. It is noted that other embodiments may employ different types of predicate formats, such as non-Boolean predicates.
  • vector / is a vector of pointers to structures, although in this example they all point to the same instance.
  • Vector j is a vector of simple integers. The compiler can infer this type information from the scalar function declaration.
  • One possible vector variant of function har ⁇ calculates p.h+j for each element of the input vectors, and writes these results into the appropriate array indexes of p.ptr. It also returns a vector of results based on the comparison of p.b and /,
  • the compiler vertically vectorized the function. That is, because barf) contains no loop, there are no loop iterations to be transformed into vector elements, as would be the case in horizontal vectorizaiion. Instead, the vectorized version of bar() may concurrently operate on different elements of the v ector inputs.
  • compiler 200 may read the dependency information about the function bar(), which may not necessarily be located in the same source file, and determine that called function h ni; has no dependencies on g.a, even though the calling function is passing a pointer to the structure g. Because it has this information, compiler 200 can horizontally vectorize the loop in function foo(). Furthermore, compiler 200 can make a single function call to the vector variant oi barQ for each vector processed, rather than calling the scalar variant in every iteration of the loop. Finally, compiler 200 may create a vector variant of foo() with a vector interface, In this particular case vertical vectorizaiion may not be applied since the full extent of x cannot be analyzed for dependencies.
  • Horizontal vectorizaiion of the loop may be applied, and it is contained within another loop that iterates over the vector elements that were passed to the vector variant of function fooQ.
  • function fooQ might export the following dependencies: void foo i int j )
  • compiler 200 could tell that structure member ptrfj is written to as a function of x. Thus, compiler 200 may report, to callers oi ' fooQ that the index that is written to is unknown, since it cannot be determined by callers oifboQ.
  • addressing can include mathematical expressions. This is generally true as Song as the expression does not involve a function call, and contains only terms that are visible to the calling function. This can include indirect addressing, such as when look-up tables are used in the calculation of indexes into other arrays.
  • Indirect addressing is one situation where configuring the compiler and linker to export static arrays as public can help vectorize more loops.
  • the dependencies generated for fooi) may differ depending on whether the compiler and linker are configured to export static symbols publicly.
  • the first dependency file expresses private static variables and the second dependency file expresses public static variables: int foo(int i)
  • Conditional expressions may also exist in the calculation of the address. For example, consider the following code: if (A [x] ⁇ c )
  • This code may be expressed in a dependency database as: read public A [x] ;
  • This expression may inform the compiler about a specific dependency on B if the condition is tme and an unknown dependency on B when the condition is false,
  • this iunction may be expressed as: read public A [x] ;
  • vector functions that meet a set of criteria may be called speculatively in cases where software speculation would be necessary to vectorize the calling loop. Accordingly, speculation-safe indicators may be expressed in the dependency file and may serve as indications that the corresponding code may be safely called in a speculative manner.
  • vector functions that are capable of being called speculatively may fall into one of two categories: type-A and type-B.
  • Type-A functions may be vector-functions having the normal vector interface described herein. For instance, type-A functions may be called speculatively with no harmful side effects if they meet the following criteria. First, the iunction accesses no memory other than local automatic non-array storage. Second, the function does not call any other functions that are not also type-A functions. Examples of type-A functions might be transcendentals or other iterative convergence algorithms.
  • type-B functions may return a predicate vector that indicates which elements were processed.
  • the criteria for speculatively calling type-B functions may be as follows. First, any reads from nonlocal storage or local array storage use first-faulting read instructions. Second, the function does not write to non-local storage or static local storage. Third, the function does not call any functions that are not also type-A or type-B functions.
  • Calling a type-A function from a loop may be similar to calling a non-speculative function. Typically, no special action is necessary on the part of the calling loop when speculatively calling a type-A function. Calling a type-B function, however, may require the calling loop to check the return vector in order to determine which elements were processed, and adjust the behavior of the calling loop in response.
  • a compiler such as compiler 200 may choose to have all callers of type-B vector functions adjust their behavior to accommodate the number of elements that were actually processed, regardless of whether software speculation is used in the calling loop.
  • compiler 200 may create two vector-functions for each type-B function; one speculative and one non-speculative.
  • the criterion for type-B loops can be generally designed to ensure that those loops that qualify are few and small, and thus the code-size impact for this approach may be negligible.
  • Type-A. and type-B vector functions may be identified by their declaration in the dependency database, as shown below. In one implementation, the absence of a designator implies the function may not be called speculatively.
  • Aliasing can sometimes be a problem for vectorizing compilers. While Macroscalar architecture addresses the problem through run-time alias analysis, there is an overhead to this approach. Overhead in Macroscalar programs contributes to the serial component in Amdahl's law, which can limit the benefits of wider vectors. Moreover, aliasing with external or static variables can affect behavior across function calls. Therefore, in one implementation, compile- time alias analysis is performed and an aliasing indicator is exported to a dependency file.
  • inbound aliasing may refer to addresses that come into a function, such as those passed-in as parameters, read from external variables, or calculated by the function by taking the address of an external variable.
  • outbound aliasing may refer to pointers that the functioninstall out. These can be return values— i.e., values thai the function writes into external variables or dereferenced pointers.
  • aliasing can be tracked. "Copies aliasing” may indicate that the pointer may be a copy of another pointer and might alias anything the pointer can alias. "Points aliasing” may indicate that a pointer is likely to affect another variable. Alias information in the dependency file is an affirmative expression of the possible existence of an alias. It need not be used, for example, when the compiler simply cannot tell whether two pointers reference the same memory due to lack of information.
  • this function may express the following dependencies: void foo(int. x, int y) read public s , ⁇
  • the values returned by a function may also result in aliasing, for example, through the return value itself or through information returned by modifying passed-by-reference variables. These can also be tracked in the dependency file, For example, consider the function below: static f1oat gVar ;
  • this function may export the following dependencies:
  • the dependency declaration may inform the calling loop that the pointer returned by fooQ might be a copy of the pointer that was passed in. This allows the calling loop to take measures to ensure correct operation of the loop regardless of the aliasing that occurs. Furthermore, this knowledge can also enable the compiler to better leverage ANSI aliasing rules when faced with code that is no ANSI-C compliant.
  • this function may export the following dependencies: void Zerolnt. (char *ptr, int x)
  • Calls via function pointers may not ordinarily be vectorized due to the fact that it is unknown at compile-time what function will be called or whether the called function supports a vector interface.
  • Functions that call other functions via pointers may not export dependency information, which can be a reflection on the uncertainty of the dependencies on the pointed-to function. This may cause the compiler to view such functions as scalar functions with unknown dependencies.
  • a versioning scheme allows dependencies to be expressed using best practices at any point in time. For example, an embodiment may permit backward compatibility with dependency-files generated by older compilers, whereas another embodiment may permit bi-directional compatibility that enables older compilers to also read files generated by newer compilers. In cases where backward compatibility is the only requirement, then a version designator for the dependency file is used to inform older compilers that a given file is unreadable and should be ignored.
  • Bi-directional compatibility may be implemented as follows, Assume, for example, that compiler version 1 does not support calculations in array indices but compiler version 2 does. A write to B[x+y] may be expressed by a version- 1 compiler as:
  • a version-2 compiler may additionally export the same function using a version-2 syntax:
PCT/US2011/050713 2010-09-23 2011-09-07 Systems and methods for compiler-based vectorization of non-leaf code WO2012039937A2 (en)

Priority Applications (7)

Application Number Priority Date Filing Date Title
AU2011305837A AU2011305837B2 (en) 2010-09-23 2011-09-07 Systems and methods for compiler-based vectorization of non-leaf code
DE112011103190T DE112011103190T5 (de) 2010-09-23 2011-09-07 Systeme und Verfahren zur compiler-basierten Vektorisierung von NON-LEAF Code
KR1020137010386A KR101573586B1 (ko) 2010-09-23 2011-09-07 논-리프 코드의 컴파일러 기반 벡터화를 위한 시스템들 및 방법들
MX2013003339A MX2013003339A (es) 2010-09-23 2011-09-07 Sistemas y metodos para la vectorizacion basada en compilador de codigo no hoja.
BR112013008640A BR112013008640A2 (pt) 2010-09-23 2011-09-07 sistemas e métodos para vetorização baseada em compilador de código não foliar
CN201180045583.4A CN103119561B (zh) 2010-09-23 2011-09-07 用于对非叶代码进行基于编译器的矢量化的系统和方法
TW100134227A TWI446267B (zh) 2010-09-23 2011-09-22 用於以編譯器為基礎之非葉程式碼之向量化的系統及方法

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
US12/888,644 US8621448B2 (en) 2010-09-23 2010-09-23 Systems and methods for compiler-based vectorization of non-leaf code
US12/888,644 2010-09-23
US12/888,658 US8949808B2 (en) 2010-09-23 2010-09-23 Systems and methods for compiler-based full-function vectorization
US12/888,658 2010-09-23

Publications (2)

Publication Number Publication Date
WO2012039937A2 true WO2012039937A2 (en) 2012-03-29
WO2012039937A3 WO2012039937A3 (en) 2012-09-20

Family

ID=44937720

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/US2011/050713 WO2012039937A2 (en) 2010-09-23 2011-09-07 Systems and methods for compiler-based vectorization of non-leaf code

Country Status (9)

Country Link
KR (1) KR101573586B1 (zh)
CN (1) CN103119561B (zh)
AU (1) AU2011305837B2 (zh)
BR (1) BR112013008640A2 (zh)
DE (1) DE112011103190T5 (zh)
GB (1) GB2484000A (zh)
MX (1) MX2013003339A (zh)
TW (1) TWI446267B (zh)
WO (1) WO2012039937A2 (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9298456B2 (en) * 2012-08-21 2016-03-29 Apple Inc. Mechanism for performing speculative predicated instructions
US9817663B2 (en) 2013-03-19 2017-11-14 Apple Inc. Enhanced Macroscalar predicate operations
US9348589B2 (en) 2013-03-19 2016-05-24 Apple Inc. Enhanced predicate registers having predicates corresponding to element widths
US9830134B2 (en) * 2015-06-15 2017-11-28 Qualcomm Incorporated Generating object code from intermediate code that includes hierarchical sub-routine information
CN106371838B (zh) * 2016-08-31 2019-10-18 福建联迪商用设备有限公司 一种维护软件包依赖关系的方法及系统
CN108733432B (zh) * 2017-04-14 2021-12-21 创新先进技术有限公司 编程环境下私有方法的实现方法、调用方法及其装置
US10379825B2 (en) * 2017-05-22 2019-08-13 Ab Initio Technology Llc Automated dependency analyzer for heterogeneously programmed data processing system
JP2021501949A (ja) * 2017-11-03 2021-01-21 コーヒレント・ロジックス・インコーポレーテッド マルチ・プロセッサ・システム用プログラミングの流れ
CN109240666B (zh) * 2018-06-22 2020-08-25 北京大学 基于调用栈和依赖路径的函数调用代码生成方法及系统
US11809871B2 (en) * 2018-09-17 2023-11-07 Raytheon Company Dynamic fragmented address space layout randomization
US11366648B2 (en) * 2020-05-28 2022-06-21 Red Hat, Inc. Compiling monoglot function compositions into a single entity
CN112214221B (zh) * 2020-10-10 2023-04-28 上海上讯信息技术股份有限公司 一种用于Linux系统构建的方法与设备
CN113342319B (zh) * 2021-05-24 2024-03-22 重庆长安汽车股份有限公司 一种can故障诊断的软件代码自动生成的方法及系统
CN113536316B (zh) * 2021-06-17 2023-08-11 深圳开源互联网安全技术有限公司 组件依赖信息的检测方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7395419B1 (en) 2004-04-23 2008-07-01 Apple Inc. Macroscalar processor architecture
US7617496B2 (en) 2004-04-23 2009-11-10 Apple Inc. Macroscalar processor architecture

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09198254A (ja) * 1996-01-17 1997-07-31 Nec Ic Microcomput Syst Ltd コンパイラの最適化装置及びその方法
JP2002073333A (ja) * 2000-08-25 2002-03-12 Hitachi Ltd 手続き呼び出し先のデータ依存の解析表示方法
JP2004246776A (ja) * 2003-02-17 2004-09-02 Ricoh Co Ltd 自動変数共有化コンパイラ、自動変数共有化リンカ及びプログラム開発支援システム
US7506331B2 (en) 2004-08-30 2009-03-17 International Business Machines Corporation Method and apparatus for determining the profitability of expanding unpipelined instructions
JP2009129179A (ja) * 2007-11-22 2009-06-11 Toshiba Corp プログラム並列化支援装置およびプログラム並列化支援方法
US8255884B2 (en) 2008-06-06 2012-08-28 International Business Machines Corporation Optimized scalar promotion with load and splat SIMD instructions
US8418161B2 (en) * 2008-11-24 2013-04-09 International Business Machines Corporation System and method for loading a called class file table with data indicating a highest version of a class file
CN101477472B (zh) * 2009-01-08 2011-11-16 上海交通大学 动态二进制翻译器中热路径的多核多线程构建方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7395419B1 (en) 2004-04-23 2008-07-01 Apple Inc. Macroscalar processor architecture
US7617496B2 (en) 2004-04-23 2009-11-10 Apple Inc. Macroscalar processor architecture

Also Published As

Publication number Publication date
KR101573586B1 (ko) 2015-12-01
TWI446267B (zh) 2014-07-21
GB201116429D0 (en) 2011-11-02
TW201224933A (en) 2012-06-16
CN103119561B (zh) 2016-03-09
AU2011305837A1 (en) 2013-03-28
GB2484000A (en) 2012-03-28
WO2012039937A3 (en) 2012-09-20
BR112013008640A2 (pt) 2016-06-21
DE112011103190T5 (de) 2013-06-27
CN103119561A (zh) 2013-05-22
MX2013003339A (es) 2013-06-24
KR20130096738A (ko) 2013-08-30
AU2011305837B2 (en) 2015-05-14

Similar Documents

Publication Publication Date Title
US8621448B2 (en) Systems and methods for compiler-based vectorization of non-leaf code
US8949808B2 (en) Systems and methods for compiler-based full-function vectorization
AU2011305837B2 (en) Systems and methods for compiler-based vectorization of non-leaf code
US9529574B2 (en) Auto multi-threading in macroscalar compilers
US8793472B2 (en) Vector index instruction for generating a result vector with incremental values based on a start value and an increment value
US8417921B2 (en) Running-min and running-max instructions for processing vectors using a base value from a key element of an input vector
US9753708B2 (en) Automatic conversion of sequential array-based programs to parallel map-reduce programs
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
US8447956B2 (en) Running subtract and running divide instructions for processing vectors
US20100049950A1 (en) Running-sum instructions for processing vectors
US9182959B2 (en) Predicate count and segment count instructions for processing vectors
US20110035567A1 (en) Actual instruction and actual-fault instructions for processing vectors
US20110035568A1 (en) Select first and select last instructions for processing vectors
US20110283092A1 (en) Getfirst and assignlast instructions for processing vectors
US20100325399A1 (en) Vector test instruction for processing vectors
US20110113217A1 (en) Generate predictes instruction for processing vectors
KR20130137652A (ko) 확장 가능한 데이터 병렬 시맨틱스
US20040123280A1 (en) Dependence compensation for sparse computations
Kataev LLVM based parallelization of C programs for GPU
Jang et al. Automatic code overlay generation and partially redundant code fetch elimination
Prabhu Just in time compilation for high performance computing
Brabec Analýza paralelizovatelnosti programů na základě jejich bytecode
Lidman Increasing parallelizing compiler efficiency using commutative functions

Legal Events

Date Code Title Description
WWE Wipo information: entry into national phase

Ref document number: 201180045583.4

Country of ref document: CN

121 Ep: the epo has been informed by wipo that ep was designated in this application

Ref document number: 11758622

Country of ref document: EP

Kind code of ref document: A2

WWE Wipo information: entry into national phase

Ref document number: MX/A/2013/003339

Country of ref document: MX

WWE Wipo information: entry into national phase

Ref document number: 1120111031904

Country of ref document: DE

Ref document number: 112011103190

Country of ref document: DE

ENP Entry into the national phase in:

Ref document number: 2011305837

Country of ref document: AU

Date of ref document: 20110907

Kind code of ref document: A

ENP Entry into the national phase in:

Ref document number: 20137010386

Country of ref document: KR

Kind code of ref document: A

122 Ep: pct application non-entry in european phase

Ref document number: 11758622

Country of ref document: EP

Kind code of ref document: A2

REG Reference to national code

Ref country code: BR

Ref legal event code: B01A

Ref document number: 112013008640

Country of ref document: BR

ENP Entry into the national phase in:

Ref document number: 112013008640

Country of ref document: BR

Kind code of ref document: A2

Effective date: 20130322