1. Technical Field
Various embodiments of the present invention may relate generally to the field of data processing, system control, and data communications, and more specifically to an integrated method, system, and apparatus that may provide resource-efficient computation, especially for execution of large, many-component tasks that may be distributed on multiple processing elements.
2. Descriptions of the Related Art
Modern high-end computer architectures embody tens of thousands to millions of processing elements, large amounts of distributed memory, together with varying degrees of non-local memory, networking components and storage infrastructure. These systems present great challenges for both static and dynamic optimization of resources consumed by executing applications. Traditionally, computer architectures have labored to present applications with a single simple address space, along with intuitively reasonable semantics for sequential execution of code and access to data. The resulting paradigm has served well for years, but becomes an impediment to efficient resource allocation when both computation and data are distributed and virtually all hardware speedup is accomplished via parallel processing, rather than by faster clock rates. However, there may be a time when semiconductor manufacturers approach physical or cost-efficiency limits on the reduction of circuit sizes, leaving parallelism as the most promising avenue for performance improvement. Already, in applications where maximum performance is critical, traditional operating system (OS) resource allocation via interrupts and pre-emption impedes performance.
A challenge in efficient distributed computing is to provide system software that makes efficient use of the physical system while providing a usable abstract model of computation for writers of application code. To do so, it is advantageous that consistent choices be made along the spectrum of system elements, so that control, monitoring, reliability and security are coherent at every level. It would also be advantageous to provide computer specification systems, coordination systems, and languages with clear and reasonable semantics, so that a reasonably large subset of application developers can work productively in the new environment, and to provide compilers or interpreters that support efficient distributed execution of application code and related development tools that provide developers with options and insight regarding the execution of application code. An additional facet of the challenge is that there is a large body of existing code that exploits little or none of the potential parallelism afforded by new languages and applications.
Art of note that may be in the same general field as the current invention includes: U.S. Pat. Nos. 5,388,238, 5,583,453, 5,924,114, 6,088,817, 6,178,473. 6,625,689, 6,668,291, 6,782,447, 6,889,269, 6,965,961, 6,978,344, 7,130,936, 7,205,792, 7,246,182, 7,404,058, 7,594,087, 7,716,396, 7,730,491, and US patent applications including: 2002007830, 2003006589, 2003017716, 2003018246, 2004001551, 2005006608, 2006025364, 2008011242, 2009005567, 2009008949, 2009020475; and papers by Michael and Scott, Shavit and Zemach, Mendes, Herlihy and Wing.
Codeletsets may be constructed to exploit highly parallel architectures of many processing elements, where both data and code can be distributed in a consistent multi-level organization. Codeletset systems and methods may achieve efficient use of processing resources by maintaining a model in which distance measures can be applied to code and data. A fine level of task allocation can be performed at the level of codelets, which are groups of instructions that can be executed non-preemptively to completion after input conditions have been satisfied.
In embodiments of the invention, the Codeletset systems and methods can allocate computing resources to computing tasks by performing one or more of the following: obtaining a set of codelets that accomplish a set of tasks; obtaining a set of specifications of data requested by codelets; constructing a metric space representing localities of codelets and the data they can access; obtaining statically defined initial arrangements for codelets with respect to the metric space distances; using the metric space representation for initially placing codelets or the data; obtaining dynamically-available runtime resource requests for codelets and data; and using the metric space representation for dynamically placing or moving codelets or data.
Additionally, in embodiments, the Codeletset systems and methods can prepare for allocation opportunities and may exploit those opportunities at run-time, e.g., by analyzing at compile-time potential code and data allocations for operations and references that indicate opportunities for merging or migrating codelets and data, and then performing run-time migration of these codelets, merged codelets, or data to exercise opportunities presented by actual code and data allocations.
Moreover, in support of fine-grained execution of codelets, embodiments of Codeletset systems and methods can provide secure and efficient localized memory access through one or more of the following actions: decomposing application code to codelets; providing a local table containing logical and physical addresses; mapping the physical addresses of distinct groups of related codelets to distinct address spaces, where each distinct address space is accessible to its distinct group of related codelets; and treating any access by a given distinct groups of codelets to a space outside its distinct address space as an error.
Various embodiments of the invention may further provide methods and/or systems for representation, manipulation and/or execution of codeletsets. Codeletsets are groups of codelets that can be treated as a unit with respect to dependency analysis or execution. Codeletsets may provide a mechanism for developing and executing distributed applications, as well as a mechanism for composability of an application: codeletsets can contain codeletsets, and they can be hierarchically constructed and reused. Even though codelets can run to completion without preemption as soon as their dependencies are satisfied, they can also be run on preemptive systems, either to simulate non-preemptive multicore architectures, or because some other attributes of preemptive computing are desirable for the distributed application represented by the codeletsets. Further, hints can be given to pre-emptive OS's to minimize preemption, such as core affinity and process priority. In this way, the Codeletset systems and methods of codelets can coexist with other legacy applications on current computer systems.
According to embodiments of the invention, rather than centralized control and allocation of resources, the system code (which may, itself, be implemented via codeletsets) may merely initialize the platform for codeletsets to run by enabling the initial routines of a codeletset. According to embodiments of the invention, application programs may be decomposed into independent segments of code that can be executed with minimal system coordination.
Figures are described as follows. Note that figures are intended to provide necessary background and to teach embodiments of the invention, and are not to be considered limiting.
Glossary of Terms as they are Used
Application: a set of instructions that embody singular or multiple related specific tasks that a user wishes to perform.
Application Programmer Interface (API): a set of programmer-accessible procedures that expose functionalities of a system to manipulation by programs written by application developers who may not have access to the internal components of the system, or may desire a less complex or more consistent interface than that which is available via the underlying functionality of the system, or may desire an interface that adheres to particular standards of interoperation.
Codelet: a group of instructions that are generally able to be executed continuously to completion after their inputs become available.
Codeletsets: groups of codelets that can be treated as a unit with respect to dependency analysis or execution. A codeletset can also consist of a singleton codelet.
Computational domain: a set of processing elements that are grouped by locality or function. These domains can hierarchically include other computational domains. Hierarchical domain examples may include system, node, socket, core, and/or hardware thread.
Concurrent systems: sets of concurrent processes and objects that are manipulated by those processes.
Core: a processing unit in a computation device. These include, but are not limited to a CPU (central processing unit), GPU (graphics processing unit), FPGA (field gate programmable array), or subsets of the aforementioned.
Dependency: a directed arc between two codeletsets representing that one is to finish before the other can start.
Fractal regulation structure: mechanisms that provide efficient use of resources securely and reliably on multiple scales within the system, using similar strategies at each level.
GACT, Generalized actor: one user or a group of users, or a group of users and software agents, or a computational entity acting in the role of a user so as to achieve some goal.
GCS, Generalized computing system: one or more computers comprising programmable processors, memory, I/O devices that may be used to provide access to data and computing services.
CSIG, a codelet signal: a communication between codelets, or between a supervisory system and at least one codelet, that may be used to enable codelets whose dependencies are satisfied or to communicate status and/or completion information.
Hierarchical execution model: a multi-level execution model in which applications are disaggregated at several levels, including into codelets at a base level of granularity.
Linearizability: One or more operations in a concurrent processing system that appear to occur instantaneously. Linearizability is typically achieved by instructions that either succeed (as a group) or are discarded (rolled back) and by systems that provide “atomic” operations via special instructions, or provide locks around critical sections.
Lock-free synchronization: non-blocking synchronization of shared resources to ensure (at least) system-wide progress.
Local Area Network (LAN): connects computers and other network devices over a relatively small distance, usually within a single organization.
Node: a device consisting of one or more compute processors, and optionally memory, networking interfaces, and/or peripherals.
Over-provisioning: Providing more numerous processing elements and local memories than are minimal, to allow more latitude in resource allocation. For instance, replacing a small number of processing elements running highly sequential tasks at high clock speeds with more processing elements, running more distributed code and data at slower clock speeds.
PolyTasks: A group of related tasks that can be treated as a unit with respect to a set of computational resources. Typically, polytasks have similar resource demands, and may seek allocation of a block of resources. Polytasks can also have complementary resource requirements, and can perform load balancing by virtue of distributed requests.
Proximity: locality as in memory space, compute space, or the state of being close in time or dependence.
Queue: a data structure that can accept elements for enqueue and remove and return elements on dequeue. An element may be enqueued or dequeued at any position including, but not limited to, the beginning, end, or middle of the queue.
Run-time system (RTS): a collection of software designed to support the execution of computer programs.
Scalability: an ability of a computer system, architecture, network or process that allows it to efficiently meet demands for larger amounts of processing by use of additional processors, memory and/or connectivity.
Self-aware control system: a system that employs a model of its own performance and constraints, permitting high-level goals to be expressed declaratively with respect to model attributes.
Signal: An event enabling a codeletset. A signal can be sent by a codelet during execution.
Task: a unit of work in a software program.
Thread: a long-lived runtime processing object that is restricted to a specific processing element.
Wait-free synchronization: non-blocking synchronization of shared resources that guarantees that there is both system-wide progress, and per-thread progress.
Wide Area Network (WAN): Connects computers and other network devices over a potentially large geographic area.
Embodiments of the invention may provide methods and/or systems for representation, manipulation and/or execution of codeletsets. Codelets are groups of typically non-preemptive instructions that can normally execute continuously to completion after their dependencies are satisfied. Codeletsets are groups of codelets that can be treated as a unit with respect to dependency analysis or execution. Codeletsets may diverge from traditional programming and execution models in significant ways. Applications may be decomposed into independent segments of code that can be executed with minimal need for system coordination. According to embodiments of the invention, rather than centralized control and allocation of resources, the system code (itself implemented via codeletsets) may initialize the platform for codeletsets to run by enabling the initial codelets of a codeletset. These codelets have no prior dependencies and can therefore be enabled as soon as the codeletset is enabled. Codeletset applications need not be entirely held as text code space during their execution. In fact, translation of some infrequently used codeletset elements can be deferred, even indefinitely, if they are not required for a particular run or particular data provided during an execution.
Characteristics of embodiments of the codeletset approach may include:
Various concepts and aspects of embodiments of the invention are described in the following with references to the drawings. Note that in the description that follows, the steps and ordering of steps is given for the purpose of illustration, but many other orderings, subsets, and supersets will become obvious to the practitioner after exposure to the instant invention. The goal of brevity precludes enumerating every combination of steps that falls within the legitimate scope of the invention.
In embodiments of the invention, such as those studied in the following in greater detail, the codeletset execution model may pervade all levels of system utilization and monitoring. At a fine-grained level, the execution model may provide a series of codelets and their respective dependencies. The fine-grained nature of codelets may allow the runtime system to allocate resources efficiently and dynamically while monitoring performance and power consumption and making or enabling schedule changes to meet the performance and power demands of the application.
The Codeletset system may allocate available resources to a given application and may provide an API to access off-chip resources such as disks, peripherals, other nodes' memory, etc. The domain of the application (i.e., the nodes that are useable by the application) may be defined by the hypervisor.
In a system 101 according to an embodiment of the invention, as illustrated in
The hypervisor may allocate global resources for the given application based on the user's parameters and, optionally, parameters specified in the application. This may include how many nodes should be used and, in certain embodiments, the connectedness of the nodes. The hypervisor may set the application domain and may define the microOS running on each node. Then, the hypervisor may load application specific parameters (such as command line arguments, environment variables, etc.) and may instruct the runtime system to launch the application. The runtime system may begin the user application by launching one or more codelets on one or more cores, starting at the main program start pointer. The user application can request more codelets to be spawned at runtime. Additionally, the user application may interact directly with the runtime system for task synchronization. All off-chip I/O may be mediated by the microOS, which may serialize requests and responses for passage through serial conduits (such as disk 110, Ethernet, node-to-node communication, etc). Additionally, the microOS may facilitate the runtime system in communicating between nodes to other runtime system components. The hardware abstraction layer may provide a common API for microOS portability to other platforms and/or for the discovery of new peripherals.
The next paragraphs outline the overall structure and functionality of the different components involved in system utilization and maintenance.
TVM may provide a framework to divide work into small, non-preemptive blocks called codelets and schedule them efficiently at runtime. TVM may replace the OS with a thin layer of system software that may be able to interface directly with the hardware and may generally shield the application programmer from the complexity of the architecture. Unlike a conventional OS, TVM may expose resources that may be critical to achieve performance.
An embodiment of TVM is illustrated in
Unlike a conventional OS framework, the TVM may maintain the fractally semantic structure and may give scheduling and percolating control to the runtime system to efficiently perform the task. And by following this fractal nature, the enabled programming model may be able to provide substantial information to the runtime system. Thus, unlike monolithic threads with an unpredictable and unsophisticated caching mechanism, the granularity and runtime overhead may be managed as tightly as possible in both a static and dynamic nature to provide greater power efficiency.
The runtime system may be implemented in software as a user library and in hardware by a runtime system core to service a number of worker cores. This runtime system core can be different from the worker cores or can have special hardware to facilitate more efficient runtime operations.
Configuring and executing a dynamic runtime system according to embodiments of the invention may involve methods for efficiently allocating data processing resources to data processing tasks. Such methods may involve, at compile time, analyzing potential code and data allocations, placements and migrations, and at run time, placing or migrating codelets or data to exercise opportunities presented by actual code and data allocations, as well as, in certain embodiments, making copies of at least some data from one locale to another in anticipation of migrating one or more codelets, and moving codelets to otherwise underutilized processors.
Embodiments of the invention may involve a data processing system comprised of hardware and software that can efficiently locate a set of codelets in the system. Elements of such systems may include a digital hardware- or software-based means for (i) exchanging information among a set of processing resources in the system regarding metrics relevant to efficient placement of the set of codelets among the processing resources, (ii) determining to which of the processing resources to locate one or more codelets among said set, and (iii) mapping the one or more codelets to one or more processing resources according to said determining. In various embodiments the mappings may involve data and/or codelet migrations that are triggered by inefficient assignments of data locality. In certain scenarios, volumes codelets and data are migrated, according to the cost of migration. In some embodiments, migration cost drivers may include one or more of the following: the amount of data or code to be migrated, the distance of migration, overhead of synchronization, memory bandwidth utilization and availability.
The runtime system can use compile-time annotations or annotations from current or previous executions that specify efficient environments for codelets. Related methods in embodiments of the invention may involve compiling and running a computer program with a goal of seeking maximally resource-efficient program execution. Such methods, at a program compile-time, may determine efficient execution environments for portions of program referred to as codelets, and accordingly, at a program run-time, may locate codelets for execution at respective efficient execution environments. Furthermore, in certain embodiments, the determining of optimal environments may be done based on indications in program source code such as, for example: (i) compiler directives, (ii) function calls, wherein a type of function called may provide information regarding an optimal execution environment for said function, and/or (iii) loop bodies that may have certain characteristics such as stride, working set, floating point usage, wherein the optimal execution environment has been previously determined by systematic runs of similar loops on similar data processing platforms. The efficient execution environment for the execution of a given codelet can be defined by criteria such as, for example: power consumption, processing hardware resource usage, completion time, and/or shortest completion time for a given power consumption budget.
In embodiments of the invention, such as the system 300 illustrated in
These managers may also communicate together in a synergistic manner to attain goals that have mutual interest, e.g., a minimum completion time for given power consumption budget, etc. For example, if the performance manager wants to throttle power down, and the load balancer wants to migrate more work locally, having the two managers collocated on an RTS core means they may be able to communicate the best course of action for both their goals simultaneously and make quick, decisive actions. Thus, these subsystems may provide a control architecture that may build an internal model of performance and may attain set points based on the Generalized Actor (GACT) goals. An objective of the system may be, for example, to provide the highest performance for the least power consumption in an energy-proportional manner bounded by the GACT constraints. In embodiments of the invention, these functions may rely on the runtime system cores to asynchronously communicate with a master runtime system core by sending load and power indicators and receiving goal targets. The master runtime system core may monitor the overall performance/power profile of a given application on the chip and may tune the performance (which may include frequency, voltage, and on/off state of individual cores) of each computational domain appropriately.
The master runtime system core of each node allocated to an application may asynchronously communicate with the master runtime system core of a so-called head node for the application and may exchange performance metrics and goal targets, such as time to completion, power consumption, and maximum resource constraints (e.g., memory space, nodes, network links, etc). The hierarchical and fractal regulation structure of the runtime system hardware may reflect the hierarchical nature of the execution model. Collectively, the master runtime system cores of the nodes running an application may perform hypervisor tasks, as described further below. Runtime systems may communicate with each other and may provide feedback (e.g., the local runtime core may determine that workload is low, may tell the master runtime core, and may receive more work) such that the system as a whole is self-aware.
In an embodiment of a self-aware operating system, a fractal hierarchical network of monitoring domains may achieve regulation of a data processing system. For example, in a basic cluster, domains may be: cluster, node, socket, core, hardware thread. A process (which may be the scheduler) at each leaf domain may monitor the health of the hardware and the application (e.g., power consumption, load, progress of program completion, etc). Monitors at higher levels in the hierarchy may aggregate the information from their child domains (and may optionally add information at their domain—or may require that all monitoring is done by children) and may pass information up to their parents. When a component of the hardware fails, it may be reported up the chain. Any level in the hierarchy can choose to restart codelets that ran on the failed hardware, or they may be passed up the chain. Once a level chooses to restart the codelets, it can delegate the task down to its children for execution. Enabled codelets can also be migrated in this way. If a level finds that its queues are getting too full or that it is consuming too much power, it can migrate enabled codelets in the same way as described above. Finally, if a level finds that it has too little work, it can request work from its parent, and this request can go up the chain until a suitable donor can be found.
Codelets can create additional codelets by calling runtime library calls to define data dependencies, arguments, and program counters of additional codelets. Synchronization can be achieved through data dependence or control dependence. For example, a barrier may be implemented by spawning codelets that depend on a variable's equality with the number of actors participating in the barrier (see
MicroOS may provide off-node resources and security at the node boundary. In an embodiment of the invention, the microOS may have two components: (1) special codelets that may run on worker cores; and (2) library functions that user codelets may call via system calls (syscalls). The special codelets may be used for event-based, interrupt-driven execution or asynchronous polling of serial devices and placement of the data into queues. Typical devices may include Ethernet, ports of a switch connecting this node to other nodes, and other sources of unsolicited input (for example, but not limited to, asynchronous responses from disk-I/O). Additionally, a codelet may be reserved for timing events such as retransmit operations on reliable communication protocols such as TCP/IP. These codelets may analyze the sender and receiver to ensure that the specific sources belonging to the application that owns the node are allowed to access resources on the node or resources dedicated to the application (such as scratch space on the disk). Accesses to shared resources (such as the global file system) may be authenticated through means such as user, group, role, or capability access levels.
Library functions may allow the user application to access hardware directly without intervention or extra scheduling. Some of these functions can be implemented directly in hardware (e.g., LAN, node-to-node, or disk writes). Others may use lower level support for directly sending and/or receiving data via buffers from asynchronous input polling threads, such as requesting disk access from another node. The library calls may direct the user to access data allocated to its application. The user or the system library can specify whether to block waiting for a response (e.g., “we know it's coming back soon”) or may schedule a codelet to run with a data dependence on the result.
The library functions may be designed to be energy-efficient and hide latency by being tightly coupled with the runtime system. For example, a codelet that calls a file-system read may make the file-system request, create a codelet to process the response that has a data dependency on the file system response, and exit. This may allow the worker core to work on other codelets while the data is in transit (instead of sitting in an I/O wait state). If there is not enough concurrency, the runtime system can turn off cores or tune down the frequency of cores to allow for slower computation in the face of long latency read operations.
Embodiments of the invention may provide security in two modes: high performance computing (HPC) mode, where entire nodes are owned by one application; and non-HPC mode, where multiple applications can co-exist on one node. In HPC mode, it may generally be sufficient that security is performed at the node boundary (i.e., on-chip accesses may not be checked except for kernel/user memory spaces and read-only memory). It may also be sufficient for user applications to know the logical mapping of nodes in their application (i.e., node 0 through N−1, where N is the number of nodes in the application). The microOS may know the physical mapping of node IDs to the logical node IDs and may re-write the addresses as appropriate. Also, when the microOS obtains input from outside the node boundary, it may verify that the data is for that node. Thus, on-chip security may encompass protecting the kernel code from the user code and protecting the user's read-only memory from writing. In non-HPC mode, the microOS may allow the node to communicate with outside peripherals but generally not with other nodes. Input may be validated in the same way. Further security may be performed by the hardware as configured by the hypervisor as described in the hypervisor section. Security can be performed at a coarse grain application level, or at a fine grain codelet level. At the codelet level, because the data dependencies and the size of the data blocks are known at runtime, the security can be guaranteed by hardware by using guarded pointers (like those used on the M-machine) or by software using invalid pages or canaries (used in ProPolice or StackGuard) around data objects.
The hypervisor may generally be in charge of allocating resources to a user application. In embodiments of the invention, it may physically reside on all nodes and partially on the host system. One or more codeletsets on each chip may be made available to hypervisor functions. They may reside in runtime system cores and execution cores and may generally follow the same fine-grained execution model as the rest of the system. Embodiments of the hypervisor on the host-software may maintain a state of all resources allocated to all applications in the system. When launching an application, the Generalized Actor (GACT) can specify a set of execution environment variables such as the number of nodes and power and performance targets. The hypervisor may place the application in the system and may allocate resources such that the nodes within the application space are contiguous and may match the GACT's application request. Once a set of nodes are allocated, the host hypervisor may communicate to the hypervisor instance on each of the nodes to allocate the nodes, pass the application code image and user environment (including power and performance targets, if any), and signal the runtime system to start the application. The hypervisor may notify the microOS and runtime system of the resources allocated to the application. Then, the hypervisor instance on a given node may monitor the application performance and may work with the other hypervisor instances on other nodes allocated to the application and/or the runtime system cores to achieve the power/performance targets, e.g., by managing the relationship of power, performance, security, and resiliency to maintain an energy proportional runtime power budget (see
In non-HPC mode, where multiple applications can coexist on one node, the hypervisor may create computational domains from sets of cores. Memory, such as random-access memory (RAM), may be segmented for each application, and user applications may generally not write into each other's dynamic RAM (DRAM) or on-chip static RAM (SRAM). This can be accomplished with a basic Memory Management Unit (MMU) for power efficiency or a generalized virtual memory manager (VMM) on legacy machines. The hypervisor may determine the address prefix and size of each segment during the application boot phase, and the application addresses can be rewritten on the fly by the MMU. Generally, the addresses that map to the application's memory space can be accessed in this manner.
The hardware abstraction layer (HAL) may allow the microOS and user application to query the hardware device availability and interact with hardware in a uniform way. Devices can be execution cores, disks, network interfaces, other nodes, etc. Much of the system can be accessed by the user application via file descriptors. MicroOS library function calls, such as open, read, write, and close, may provide a basic hardware abstraction layer for the application. A driver may interact with the HAL with a series of memory reads and writes. The HAL implementation may translate these requests into the bus transactions relevant to the hardware platform. This may allow users to reuse driver code on different underlying platforms.
Additionally, an application can query the hardware or runtime system for the number of nodes available to the application, number of execution cores in a chip and memory availability, to help decide how to partition the problem. For example, if one thousand cores exist, the application can divide a loop of one million iterations into one thousand iteration codelets, whereas if there are only four cores, it could divide the work into coarser grained blocks because there is no more concurrency to be gained from the hardware and the overhead of fewer codelets is lower. In various embodiments, the optimal size of blocks can be, for instance, (1) a rounded integer quotient of the maximum number of units of work that could be done in parallel divided by the quantity of processing elements available to the application, (2) a varying size between blocks such that the maximal difference between the smallest and largest block size is minimized, or (3) a maximum size that allows completing the segment of the application in provided time budget while staying within a provided power consumption budget.
The operating system services may be performed by the microOS and the runtime system and may be regulated through the hypervisor. Together, these components make up the exemplary self-aware operating system 701, as illustrated in an embodiment shown in
In this section an embodiment of a self-optimizing system model 701 is described.
In various embodiments, the OS decision-agent (the code running on the runtime system cores) may be equipped with appropriate model builders and learning capabilities so it can take timely and effective actions for self-correction and adaptation to meet the goals. In some embodiments, the OS self-optimizing loop may invoke control theory methods to achieve its objectives. Interactions between (1) and (2) are illustrated in
To effectively use the codeletset systems and methods, application developers can provide directives, which the system may note at compile time, and which may result in better initial static allocation, better runtime (dynamic) allocation, or both.
An exemplary micro-memory management unit is illustrated in
Execution model: The runtime system and microOS may manage, migrate, and spawn codelets. They may choose the codelet versions to run according to the runtime goals. As described above, the runtime system core may manage the data dependencies between codelets, migrating data and codelets together and spawning the correct codelet version based on runtime constraints. Dependability may be viewed as a combination of security and resilience. Security aspects of the invention, according embodiments, may involve providing security markings for codelets, where marking may be used to indicate restrictions or privileges to be considered in allocations of codelets in question and their related data. Accesses of memory outside of the data bounds or prescribed privileges may result in a security exception to be handled by the runtime system. In HPC mode, a node may be completely owned by an application. Security may be provided at the core level by the user/kernel space memory and instruction set enforcement. Security is provided at the application level by the host system, which may define the set of nodes on which the application runs, and/or the hypervisor, which may relay that information to the microOS running on the allocated nodes. Security may be provided at the system level by a job manager on the host system, which may schedule and allocate nodes to applications in a mutually exclusive manner. In non-HPC mode, the system may be further subdivided into mutually exclusive chip domains and memory segments, and memory and resources may be mapped in such a way as to prevent applications from accessing each other's data on the same chip.
Resilience may be maintained by fractally monitoring the health of the system and re-executing codelets that fail. The local runtime core in a computational domain may monitor the worker core health. A node-level runtime core may monitor the runtime cores. The node-level runtime core may be monitored by the host system. When a component fails, the codelets running on the core may either be restarted (if they created no state change in the program), or the application may be restarted from a checkpoint (if the state of the program is non-determinant).
The efficiency goal may be used to maximize performance and to minimize power consumption given a set of application and system goals. This may be achieved through frequency and/or voltage scaling at the execution core level based on the dependencies of the codes and the availability of work. Also, codelets and data may be migrated to where they can most effectively communicate with each other (e.g., by keeping more tightly interacting codelets together) and consume the least amount of power (e.g., moving codelets together to allow for power domain shutdown of unused clusters and eliminate idle power consumption).
Self-optimizing: Self-optimization may be maintained through the fractal monitoring network (of both health and performance) and runtime system rescheduling to achieve the goals of the application and system while maintaining dependability and efficiency.
Operating examples and application scenarios of embodiments of the invention are described in the following with further references to the drawings.
Additionally, in the double buffer computation example, the example index 1024 bound indicates that when knit is finished, it may enable 1024 Comp1 codelets. Similarly, the example index bound 8 copy codelets may be fired in the copy codeletset. Note that the count of 8 is used because the system may have many processors demanding memory (e.g., DRAM) bandwidth to be arbitrated among them. Therefore, the codelet system can use fewer worker cores to achieve the same sustained bandwidth, although lower (context switching) overhead, thus achieving improved application program processing throughput. In another embodiment, the system can dynamically supply a place going into copy1 and returning from copy1 with 8 tokens in it all of the time. Similarly, the same optimization can be done for copy2. Finally, in another embodiment, these two places can be fused into the same place, and the copy functions could use a common pool of memory bandwidth tokens. In such a case, if the compute is longer than the copy, the system may ensure that copy1 and copy2 will not occur at the same time. This is an example of the expressive power of the Petri net for resource constraints such as memory bandwidth, execution units, power, network, locks, etc., and demonstrates that codeletsets can exploit that expressive power to enable the construction of highly parallel, highly scalable applications. Note that in 3802, AT is implicit in the fact that SignalSet(buffer_set[0]) is executed before SignalSet(buffer_set[1]).
Note that in the following discussion, the word “function” is not limiting, but meant colloquially. Any computable procedures, even arbitrary blocks of executable code, could be used rather than functions, per se, in various embodiments of the invention. Additionally, most of the discussion describes codeletset components as “polytasks,” but this is not a limitation of the invention, as single tasks could also be integrated via the same approach.
A function that registers a polytask may pass pointers to input variables needed for the polytask to be ready, pointers to the output of the polytask, a count of the number of polytasks, a function pointer to the polytask, and a priority. The first registered polytask may have no input dependencies (because there should generally be no output variables to wait for). If a polytask is immediately ready for execution, it may be inserted into a polytask ready queue of the specified priority. When a polytask with input variable dependencies is registered, the ‘check_status’ function may be run on the input variables. If they are already ready, then the polytask may be placed into the polytask ready queue of the correct priority. If they are not ready, the polytask may go into the polytask scoreboard. When a polytask is completed by the runtime system, the output dependencies may be marked as complete so that the ‘check_status’ function may return “true” now. Further, the thread that completed the polytask may also check all pending polytasks in the scoreboard for any that are now ready (because of the just completed polytask) and may put them into the polytask ready queue corresponding to the correct priority.
Each output of a polytask can be probed to determine if the polytask that creates the output is complete. The thread running the legacy code can spin waiting for status to change. Additionally, when polytasks are completed, the inputs of polytasks in the scoreboard may be checked for dependence on the outputs of the completed polytask (as described above) using check_status.
In one embodiment, the variable (for dependence checking) may be identified only by a pointer to the variable. In another embodiment, the input and output variables may be identified by a pointer and a length (or a start and end pointer). In this way, ranges of memory can be marked as complete or incomplete. In another embodiment, the pointer or pointer range can be annotated with an iteration count. In this way, the same memory can be ‘complete’ and ‘not complete’ depending on the iteration.
When a polytask is registered and input dependency variables are present, the table can be scanned for which polytask satisfies the dependence. A satisfying polytask can be annotated with a pointer to the newly registered function. In this way, when the satisfying polytask is completed, the scan can be skipped.
Various embodiments of the invention may address optimization of performance of an application program with respect to some performance measure(s) or with respect to some resource constraint(s). Exemplary performance measures or constraints may relate to, but are not limited to, a total runtime of the program, a runtime of the program within a particular section, a maximum delay before an execution of particular instruction, a quantity of processing units used, a quantity of memory used, a usage of register files, a usage of cache memory, a usage of level 1 cache, a usage of level 2 cache, a usage of level 3 cache, a usage of level N cache wherein N is a positive number, a usage of static RAM memory, a usage of dynamic RAM memory, a usage of global memory, a usage of virtual memory, a quantity of processors available for uses other than executing the program, a quantity of memory available for uses other than executing the program, energy consumption, a peak energy consumption, a longevity cost to a computing system, a volume of register updates needed, a volume of memory clearing needed, an efficacy of security enforcement and a cost of security enforcement.
Various implementations of the invention may be embodied in various forms, such as method, apparatus, etc. Among such embodiments may be embodiments in the form of one or more storage media (e.g., various types of memories, disks, etc.), having stored in them executable code/software instructions, which may be usable/readable by a computer and/or accessible via a communication network. While a computer-readable medium may, in general, include a signal carrying such code/software, in the context of this application, “storage medium” is understood to exclude such signals, per se.
This detailed description provides a specification of embodiments of the invention for illustrative system operation scenarios and application examples discussed in the preceding. Specific application, architectural and logic implementation examples are provided in this and the referenced patent applications for the purpose of illustrating possible implementation examples of the invented concepts, as well as related invention utilization scenarios. Naturally, there are multiple alternative ways to implement or utilize, in whole or in part, the principles of the invention as set forth in the aforementioned. For instance, elements or process steps described or shown herein as distinct can in various embodiments be combined with each other or with additional elements or steps. Described elements can also be further subdivided, without departing from the spirit and scope of the invention. Moreover, aspects of the invention may in various embodiments be implemented using application and system software, general and specialized micro-processors, custom hardware logic, and various combinations thereof. Generally, those skilled in the art will be able to develop different versions and various modifications of the described embodiments, which, even if not each explicitly described herein individually, rely on the principles of the invention, and are thus included within its spirit and scope. It is thus intended that the specification and drawings be considered not in a restrictive sense, but as exemplary only, with the true scope of the invention indicated by the following claims.
This application claims the benefit of U.S. Provisional Application No. 61/377,067, filed Aug. 25, 2010, and U.S. Provisional Application No. 61/386,472, filed Sep. 25, 2010, each of which is incorporated by reference in its entirety.
The United States Government has rights in portions of this invention pursuant to Contract No. HR0011-10-0007 between the United States Defense Advanced Research Projects Agency (DARPA) and ET International, Inc.
Number | Date | Country | |
---|---|---|---|
61377067 | Aug 2010 | US | |
61386472 | Sep 2010 | US |