Efficient Support of Position Independence on Non-Volatile Memory

Total Page:16

File Type:pdf, Size:1020Kb

Efficient Support of Position Independence on Non-Volatile Memory Efficient Support of Position Independence on Non-Volatile Memory Guoyang Chen Lei Zhang Richa Budhiraja Qualcomm Inc. North Carolina State University Qualcomm Inc. [email protected] Raleigh, NC [email protected] [email protected] Xipeng Shen Youfeng Wu North Carolina State University Intel Corp. Raleigh, NC [email protected] [email protected] ABSTRACT In Proceedings of MICRO-50, Cambridge, MA, USA, October 14–18, 2017, This paper explores solutions for enabling efficient supports of 13 pages. https://doi.org/10.1145/3123939.3124543 position independence of pointer-based data structures on byte- addressable None-Volatile Memory (NVM). When a dynamic data structure (e.g., a linked list) gets loaded from persistent storage into 1 INTRODUCTION main memory in different executions, the locations of the elements Byte-Addressable Non-Volatile Memory (NVM) is a new class contained in the data structure could differ in the address spaces of memory technologies, including phase-change memory (PCM), from one run to another. As a result, some special support must memristors, STT-MRAM, resistive RAM (ReRAM), and even flash- be provided to ensure that the pointers contained in the data struc- backed DRAM (NV-DIMMs). Unlike on DRAM, data on NVM tures always point to the correct locations, which is called position are durable, despite software crashes or power loss. Compared to independence. existing flash storage, some of these NVM technologies promise This paper shows the insufficiency of traditional methods in sup- 10-100x better performance, and can be accessed via memory in- porting position independence on NVM. It proposes a concept called structions rather than I/O operations. For its appealing properties, implicit self-contained representations of pointers, and develops NVM has the potential to create some important impact on comput- two such representations named off-holder and Region ID in Value ing. NVM has drawn some strong interest in industry, exemplified (RIV) to materialize the concept. Experiments show that the enabled with the 3d-XPoint memory announcement by Intel and Micron [2], representations provide much more efficient and flexible support the “The Machine” project by HP [8], the explorations to use it for of position independence for dynamic data structures, alleviating a databases [4], key-value stores [5], file systems [11, 13, 32], and so major issue for effective data reuses on NVM. on [20]. Designs of traditional systems for general applications have been CCS CONCEPTS assuming a separation of memory and storage. Effectively support- • Hardware Memory and dense storage; • Computer systems ing NVM hence requires innovations across the entire computing ! organization Architectures; • Software and its engineering stack. Recent years have seen many studies on architectural de- ! ! Compilers; General programming languages; signs (e.g., [17–19, 21, 23, 24, 33]), operating system extensions (e.g., [11–13, 22, 27, 28, 31, 32]), and programming model develop- KEYWORDS ments (e.g., [1, 3, 6–10, 15, 29]). Compiler, Program Optimizations, Programming Languages, NVM These studies have primarily concentrated on how to provide ACID (Atomicity, Consistency, Isolation, and Durability) for appli- ACM Reference format: cations that use NVM, such as how to ensure data consistency and Guoyang Chen, Lei Zhang, Richa Budhiraja, Xipeng Shen, and Youfeng Wu. recoverability upon a system crash, how to minimize the needed 2017. Efficient Support of Position Independence on Non-Volatile Memory. logging overhead, how to support atomic updates. In this paper, we concentrate on a different dimension: data * The work was done when Guoyang Chen and Richa Budhiraja were students at NCSU. reusability, which refers to how efficiently and flexibly an appli- cation can use the data previously stored on NVM by this or other Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed applications. ACID support is important for applications to function for profit or commercial advantage and that copies bear this notice and the full citation soundly on NVM, while data reusability is critical for turning NVM on the first page. Copyrights for components of this work owned by others than ACM persistency into computing efficiency. must be honored. Abstracting with credit is permitted. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a More specifically, this work is focused on a fundamental aspect in fee. Request permissions from [email protected]. enhancing data reusability: the support of position independence in MICRO-50, October 14–18, 2017, Cambridge, MA, USA pointer-based data structures. A central challenge for efficient data © 2017 Association for Computing Machinery. ACM ISBN 978-1-4503-4952-9/17/10. $15.00 reuse is to enable position independence for dynamic data structures. https://doi.org/10.1145/3123939.3124543 A data object is position independent if all the references in the data 191 MICRO-50, October 14–18, 2017, Cambridge, MA, USA G.Chen, L.Zhang, R.Budhiraja, X.Shen and Y.Wu struct uint regionID; ulong offset (offset is the offset 100000h 130000h { } of the target location from the base address of the NVRegion that next = 100020h next = 100020h has an ID equaling regionID). It calculates the actual address from the fields of the struct or class at each pointer access. It doubles the space usage of pointers, and at the same time, incurs time overhead 100020h 130020h target target similarly large as swizzling causes. A better support of position independence is hence essential for data reusability on NVM. This paper describes our solutions to the problem, which consist of two novel representations of pointers and some programming lan- guage extensions. The key in our solution is the concept of implicit (a) Addr. Space in Run-1 (b) Addr. Space in Run-2 self-contained representations of pointers. A pointer is in an implicit self-contained representation if it meets three conditions: (1) it is Figure 1: Issue of position dependent representation: “next” no larger than a normal pointer; (2) it contains all the info needed points to a wrong target in Run-2 when the data region are for locating the target address of the pointer; (3) programmers can mapped to a different virtual address than in Run-1. use the pointer for data accesses in the same way as using a normal pointer (the type declaration could differ). Such representations min- imize the space overhead of pointers in a dynamic data structure, object keep their integrity (i.e., pointing to the correct addresses) and at the same time, allow intuitive usage of non-volatile pointers. regardless of where in the memory space the data object is mapped. The challenge is how to materialize the representations such that Dynamic data structures impose special difficulties for achieving they incur the minimum runtime overhead. Concatenating the two position independence due to the usage of pointers and references fields of a fat pointer (regionID and offset) into one 64-bit word, in them. Consider a linked list, in which, each node contains a for instance, can make the pointer self contained. But it would still field “next” that carries the address of the next node as illustrated require translations between the regionID and the address of the in Figure 1 (a). This implementation of pointers is not position region at runtime, which, without a careful implementation, could independent. If the linked list is mapped to a different location as easily incur large overhead. Figure 1 (b) shows, the value of “next” of the first node would not We solve the problem by developing off-holder and Region ID equal the current address of the second node, causing errors in the in Value (RIV) pointer representations, two implicit self-contained linked list. All data structures containing pointers are subject to this representations of pointers to enable efficient support of position issue, including linked lists, graphs, trees, hash tables, maps, classes, independence. By storing the offset of the target location and the and so on. pointer’s own address, off-holder offers an efficient support for point- Position independence is an essential requirement for NVM. Data ers pointing to locations within the same NVRegion as the pointers on NVM are supposed to be reused across runs and applications. reside. RIV gives a more general solution, supporting pointers both Requiring a data object to always map to the same virtual address is within and across regions. To make the runtime convertions between impractical in general systems. The address could be already used by region IDs and addresses efficient, we come up with a novel ap- some other shared memories or objects. Moreover, modern operating proach to realizing the convertions through some mapping functions systems have broadly adopted address space randomization [26], involving only several bit transformations. We provide a compari- a security technique that prevents malicious attacks by varying the son of the two new representations with existing alternatives both starting addresses of stacks and heaps at the launching time of a qualitatively and quantitatively. program. Experiments show that the enabled representations provide much Position independence is needed on traditional secondary stor- more efficient support of position independence for dynamic data age, such as database or Java objects. The method used there is structures than existing representations do. For single-region ac- pointer swizzling/unswizzling [14] (happening during data serializa- cesses, the overhead reduces from over 3X (swizzling or fat pointer) tion/deserialization), which uses position-independent indices (e.g., to 1.13X; for multi-region accesses, the overhead reduces from 2.2X offset in a file) for pointers on the secondary storage and converts to 1.4X. The exploration also reveals some other insights on support- them to direct pointers when the data are loaded into memory.
Recommended publications
  • An Efficient Framework for Implementing Persistent Data Structures on Asymmetric NVM Architecture
    AsymNVM: An Efficient Framework for Implementing Persistent Data Structures on Asymmetric NVM Architecture Teng Ma Mingxing Zhang Kang Chen∗ [email protected] [email protected] [email protected] Tsinghua University Tsinghua University & Sangfor Tsinghua University Beijing, China Shenzhen, China Beijing, China Zhuo Song Yongwei Wu Xuehai Qian [email protected] [email protected] [email protected] Alibaba Tsinghua University University of Southern California Beijing, China Beijing, China Los Angles, CA Abstract We build AsymNVM framework based on AsymNVM ar- The byte-addressable non-volatile memory (NVM) is a promis- chitecture that implements: 1) high performance persistent ing technology since it simultaneously provides DRAM-like data structure update; 2) NVM data management; 3) con- performance, disk-like capacity, and persistency. The cur- currency control; and 4) crash-consistency and replication. rent NVM deployment with byte-addressability is symmetric, The key idea to remove persistency bottleneck is the use of where NVM devices are directly attached to servers. Due to operation log that reduces stall time due to RDMA writes and the higher density, NVM provides much larger capacity and enables efficient batching and caching in front-end nodes. should be shared among servers. Unfortunately, in the sym- To evaluate performance, we construct eight widely used metric setting, the availability of NVM devices is affected by data structures and two transaction applications based on the specific machine it is attached to. High availability canbe AsymNVM framework. In a 10-node cluster equipped with achieved by replicating data to NVM on a remote machine. real NVM devices, results show that AsymNVM achieves However, it requires full replication of data structure in local similar or better performance compared to the best possible memory — limiting the size of the working set.
    [Show full text]
  • English Arabic Technical Computing Dictionary
    English Arabic Technical Computing Dictionary Arabeyes Arabisation Team http://wiki.arabeyes.org/Technical Dictionary Versin: 0.1.29-04-2007 April 29, 2007 This is a compilation of the Technical Computing Dictionary that is under development at Arabeyes, the Arabic UNIX project. The technical dictionary aims to to translate and standardise technical terms that are used in software. It is an effort to unify the terms used across all Open Source projects and to present the user with consistant and understandable interfaces. This work is licensed under the FreeBSD Documentation License, the text of which is available at the back of this document. Contributors are welcome, please consult the URL above or contact [email protected]. Q Ì ÉJ ªË@ éÒ¢@ Ñ«YË QK AK.Q« ¨ðQåÓ .« èQK ñ¢ ÕæK ø YË@ úæ®JË@ úGñAm '@ ñÓA®ÊË éj èYë . l×. @QK. éÔg. QK ú¯ éÊÒªJÖÏ@ éJ J®JË@ HAjÊ¢Ö Ï@ YJ kñKð éÔg. QK úÍ@ ñÓA®Ë@ ¬YîE .ºKñJ ËAK. éîD J.Ë@ ÐYjJÒÊË éÒj. Óð éÓñê®Ó H. ñAg éêk. @ð Õç'Y®JË ð á ÔgQÖÏ@ á K. H. PAJË@ øXA®JË ,H. ñAmÌ'@ . ¾JÖ Ï .ñÓA®Ë@ éK AîE ú ¯ èQ¯ñJÖÏ@ ð ZAKñÊË ø X @ ú G. ø Q¯ ékP ù ë ñÓA®Ë@ ékP . éJ K.QªËAK. ÕÎ @ [email protected] . úΫ ÈAB@ ð@ èC«@ à@ñJªË@ úÍ@ H. AëYË@ ZAg. QË@ ,á ÒëAÖÏ@ ɾK. I. kQK A Abortive release êm .× (ú¾J.) ¨A¢®K@ Abort Aêk . @ Abscissa ú æJ Absolute address Ê¢Ó à@ñ J« Absolute pathname Ê¢Ó PAÓ Õæ @ Absolute path Ê¢Ó PAÓ Absolute Ê¢Ó Abstract class XQm.× ­J Abstract data type XQm.× HA KAJ K.
    [Show full text]
  • Data Structures Are Ways to Organize Data (Informa- Tion). Examples
    CPSC 211 Data Structures & Implementations (c) Texas A&M University [ 1 ] What are Data Structures? Data structures are ways to organize data (informa- tion). Examples: simple variables — primitive types objects — collection of data items of various types arrays — collection of data items of the same type, stored contiguously linked lists — sequence of data items, each one points to the next one Typically, algorithms go with the data structures to manipulate the data (e.g., the methods of a class). This course will cover some more complicated data structures: how to implement them efficiently what they are good for CPSC 211 Data Structures & Implementations (c) Texas A&M University [ 2 ] Abstract Data Types An abstract data type (ADT) defines a state of an object and operations that act on the object, possibly changing the state. Similar to a Java class. This course will cover specifications of several common ADTs pros and cons of different implementations of the ADTs (e.g., array or linked list? sorted or unsorted?) how the ADT can be used to solve other problems CPSC 211 Data Structures & Implementations (c) Texas A&M University [ 3 ] Specific ADTs The ADTs to be studied (and some sample applica- tions) are: stack evaluate arithmetic expressions queue simulate complex systems, such as traffic general list AI systems, including the LISP language tree simple and fast sorting table database applications, with quick look-up CPSC 211 Data Structures & Implementations (c) Texas A&M University [ 4 ] How Does C Fit In? Although data structures are universal (can be imple- mented in any programming language), this course will use Java and C: non-object-oriented parts of Java are based on C C is not object-oriented We will learn how to gain the advantages of data ab- straction and modularity in C, by using self-discipline to achieve what Java forces you to do.
    [Show full text]
  • Software II: Principles of Programming Languages
    Software II: Principles of Programming Languages Lecture 6 – Data Types Some Basic Definitions • A data type defines a collection of data objects and a set of predefined operations on those objects • A descriptor is the collection of the attributes of a variable • An object represents an instance of a user- defined (abstract data) type • One design issue for all data types: What operations are defined and how are they specified? Primitive Data Types • Almost all programming languages provide a set of primitive data types • Primitive data types: Those not defined in terms of other data types • Some primitive data types are merely reflections of the hardware • Others require only a little non-hardware support for their implementation The Integer Data Type • Almost always an exact reflection of the hardware so the mapping is trivial • There may be as many as eight different integer types in a language • Java’s signed integer sizes: byte , short , int , long The Floating Point Data Type • Model real numbers, but only as approximations • Languages for scientific use support at least two floating-point types (e.g., float and double ; sometimes more • Usually exactly like the hardware, but not always • IEEE Floating-Point Standard 754 Complex Data Type • Some languages support a complex type, e.g., C99, Fortran, and Python • Each value consists of two floats, the real part and the imaginary part • Literal form real component – (in Fortran: (7, 3) imaginary – (in Python): (7 + 3j) component The Decimal Data Type • For business applications (money)
    [Show full text]
  • Purely Functional Data Structures
    Purely Functional Data Structures Chris Okasaki September 1996 CMU-CS-96-177 School of Computer Science Carnegie Mellon University Pittsburgh, PA 15213 Submitted in partial fulfillment of the requirements for the degree of Doctor of Philosophy. Thesis Committee: Peter Lee, Chair Robert Harper Daniel Sleator Robert Tarjan, Princeton University Copyright c 1996 Chris Okasaki This research was sponsored by the Advanced Research Projects Agency (ARPA) under Contract No. F19628- 95-C-0050. The views and conclusions contained in this document are those of the author and should not be interpreted as representing the official policies, either expressed or implied, of ARPA or the U.S. Government. Keywords: functional programming, data structures, lazy evaluation, amortization For Maria Abstract When a C programmer needs an efficient data structure for a particular prob- lem, he or she can often simply look one up in any of a number of good text- books or handbooks. Unfortunately, programmers in functional languages such as Standard ML or Haskell do not have this luxury. Although some data struc- tures designed for imperative languages such as C can be quite easily adapted to a functional setting, most cannot, usually because they depend in crucial ways on as- signments, which are disallowed, or at least discouraged, in functional languages. To address this imbalance, we describe several techniques for designing functional data structures, and numerous original data structures based on these techniques, including multiple variations of lists, queues, double-ended queues, and heaps, many supporting more exotic features such as random access or efficient catena- tion. In addition, we expose the fundamental role of lazy evaluation in amortized functional data structures.
    [Show full text]
  • Heapmon: a Low Overhead, Automatic, and Programmable Memory Bug Detector ∗
    Appears in the Proceedings of the First IBM PAC2 Conference HeapMon: a Low Overhead, Automatic, and Programmable Memory Bug Detector ∗ Rithin Shetty, Mazen Kharbutli, Yan Solihin Milos Prvulovic Dept. of Electrical and Computer Engineering College of Computing North Carolina State University Georgia Institute of Technology frkshetty,mmkharbu,[email protected] [email protected] Abstract memory bug detection tool, improves debugging productiv- ity by a factor of ten, and saves $7,000 in development costs Detection of memory-related bugs is a very important aspect of the per programmer per year [10]. Memory bugs are not easy software development cycle, yet there are not many reliable and ef- to find via code inspection because a memory bug may in- ficient tools available for this purpose. Most of the tools and tech- volve several different code fragments which can even be in niques available have either a high performance overhead or require different files or modules. The compiler is also of little help a high degree of human intervention. This paper presents HeapMon, in finding heap-related memory bugs because it often fails to a novel hardware/software approach to detecting memory bugs, such fully disambiguate pointers [18]. As a result, detection and as reads from uninitialized or unallocated memory locations. This new identification of memory bugs must typically be done at run- approach does not require human intervention and has only minor stor- time [1, 2, 3, 4, 6, 7, 8, 9, 11, 13, 14, 18]. Unfortunately, the age and execution time overheads. effects of a memory bug may become apparent long after the HeapMon relies on a helper thread that runs on a separate processor bug has been triggered.
    [Show full text]
  • Database : a Toolkit for Constructing Memory Mapped Databases Peter A
    Database : A Toolkit for Constructing Memory Mapped Databases Peter A. Buhr, Anil K. Goel and Anderson Wai Dept. of Computer Science, University of Waterloo Waterloo, Ontario, Canada, N2L 3G1 Abstract The main objective of this work was an ef®cient methodology for constructing low-level database tools that are built around a single-level store implemented using memory mapping. The methodology allowed normal programming pointers to be stored directly onto secondary storage, and subsequently retrieved and manipulated by other programs without the need for relocation, pointer swizzling or reading all the data. File structures for a database, e.g. a B- Tree, built using this approach are signi®cantly simpler to build, test, and maintain than traditional ®le structures. All access methods to the ®le structure are statically type-safe and ®le structure de®nitions can be generic in the type of the record and possibly key(s) stored in the ®le structure, which affords signi®cant code reuse. An additional design requirement is that multiple ®le structures may be simultaneously accessible by an application. Concurrency at both the front end (multiple accessors) and the back end (®le structure partitioned over multiple disks) are possible. Finally, experimental results between traditional and memory mapped ®les structures show that performance of a memory mapped ®le structure is as good or better than the traditional approach. 1 Introduction The main objective of this work was an ef®cient methodology for constructing low-level database tools that are built around a single-level store. A single-level store gives the illusion that data on disk (secondary storage) is accessible in the same way as data in main memory (primary storage), which is analogous to the goals of virtual memory.
    [Show full text]
  • Reducing the Storage Overhead of Main-Memory OLTP Databases with Hybrid Indexes
    Reducing the Storage Overhead of Main-Memory OLTP Databases with Hybrid Indexes Huanchen Zhang David G. Andersen Andrew Pavlo Carnegie Mellon University Carnegie Mellon University Carnegie Mellon University [email protected] [email protected] [email protected] Michael Kaminsky Lin Ma Rui Shen Intel Labs Carnegie Mellon University VoltDB [email protected] [email protected] [email protected] ABSTRACT keep more data resident in memory. Higher memory efficiency al- Using indexes for query execution is crucial for achieving high per- lows for a larger working set, which enables the system to achieve formance in modern on-line transaction processing databases. For higher performance with the same hardware. a main-memory database, however, these indexes consume a large Index data structures consume a large portion of the database’s fraction of the total memory available and are thus a major source total memory—particularly in OLTP databases, where tuples are of storage overhead of in-memory databases. To reduce this over- relatively small and tables can have many indexes. For example, head, we propose using a two-stage index: The first stage ingests when running TPC-C on H-Store [33], a state-of-the-art in-memory all incoming entries and is kept small for fast read and write opera- DBMS, indexes consume around 55% of the total memory. Freeing tions. The index periodically migrates entries from the first stage to up that memory can lead to the above-mentioned benefits: lower the second, which uses a more compact, read-optimized data struc- costs and/or the ability to store additional data.
    [Show full text]
  • Consistent Overhead Byte Stuffing
    Consistent Overhead Byte Stuffing Stuart Cheshire and Mary Baker Computer Science Department, Stanford University Stanford, California 94305, USA {cheshire,mgbaker}@cs.stanford.edu ted packet. In general, some added overhead (in terms Abstract of additional bytes transmitted over the serial me- dium) is inevitable if we are to perform byte stuffing Byte stuffing is a process that transforms a sequence of data without loss of information. bytes that may contain ‘illegal’ or ‘reserved’ values into a potentially longer sequence that contains no occurrences of Current byte stuffing algorithms, such as those used those values. The extra length is referred to in this paper as by SLIP [RFC1055], PPP [RFC1662] and AX.25 the overhead of the algorithm. [ARRL84], have potentially high variance in per- packet overhead. For example, using PPP byte To date, byte stuffing algorithms, such as those used by stuffing, the overall overhead (averaged over a large SLIP [RFC1055], PPP [RFC1662] and AX.25 [ARRL84], number of packets) is typically 1% or less, but indi- have been designed to incur low average overhead but have vidual packets can increase in size by as much as made little effort to minimize worst case overhead. 100%. Some increasingly popular network devices, however, care While this variability in overhead may add some jitter more about the worst case. For example, the transmission and unpredictability to network behavior, it has only time for ISM-band packet radio transmitters is strictly minor implications for running PPP over a telephone limited by FCC regulation. To adhere to this regulation, the modem. The IP host using the PPP protocol has only practice is to set the maximum packet size artificially low so to make its transmit and receive serial buffers twice as that no packet, even after worst case overhead, can exceed big as the largest IP packet it expects to send or the transmission time limit.
    [Show full text]
  • Memory Analysis What Does Percolation Model?
    Class Meeting #2 COS 226 — Spring 2018 Based on slides by Jérémie Lumbroso — Motivation — Problem description — API — Backwash — Empirical Analysis — Memory Analysis What does Percolation model? Other examples: • Water freezing • Ferromagnetic effects Create private “helper” funtion private int getIntFromCoord(int row, int col) { return N * row + col; } Or perhaps since this function will be used a lot, should it have a shorter name? For ex.: site or location or cell or grid, etc., … public class UF initialize union-find data structure with UF(int N) what you must do N objects (0 to N – 1) void union(int p,int q) add connection between p and q both are APIs boolean connected(int p,int q) are p and q in the same component? what is int find(int p) component identifier for p (0 to N – 1) provided int count() number of components Why an API? API = Application Programming Interface —a contract between a programmers —be able to know about the functionality without details from the implementation open union PercolationStats Percolation UF percolates connected Each of these modules could be programmed by anybody / implemented anyway Example 1: Car public class Car { void turnLeft() void turnRight() void shift(int gear) void break() } A. Electrical? B. Hybrid? C. Gasoline? D. Diesel? E. Hydrogen cell? Example 1: Car public class Car { void turnLeft() void turnRight() void shift(int gear) void break() } Example 2: Electrical Outlets original API API with added public members is incompatible with rest of the clients Why is it so important to implement the prescribed API? Writing to an API is an important skill to master because it is an essential component of modular programming, whether you are developing software by yourself or as part of a group.
    [Show full text]
  • Optimizing Data Structures in High-Level Programs New Directions for Extensible Compilers Based on Staging
    Optimizing Data Structures in High-Level Programs New Directions for Extensible Compilers based on Staging Tiark Rompf ∗‡ Arvind K. Sujeeth† Nada Amin∗ Kevin J. Brown† Vojin Jovanovic∗ HyoukJoong Lee† Manohar Jonnalagedda∗ Kunle Olukotun† Martin Odersky∗ ∗EPFL: {first.last}@epfl.ch ‡Oracle Labs †Stanford University: {asujeeth, kjbrown, hyouklee, kunle}@stanford.edu Abstract // Vectors object Vector { High level data structures are a cornerstone of modern program- def fromArray[T:Numeric](a: Array[T]) = ming and at the same time stand in the way of compiler optimiza- new Vector { val data = a } tions. In order to reason about user or library-defined data struc- def zeros[T:Numeric](n: Int) = tures, compilers need to be extensible. Common mechanisms to Vector.fromArray(Array.fill(n)(i => zero[T])) extend compilers fall into two categories. Frontend macros, stag- } ing or partial evaluation systems can be used to programmatically abstract class Vector[T:Numeric] { remove abstraction and specialize programs before they enter the val data: Array[T] compiler. Alternatively, some compilers allow extending the in- def +(that: Vector[T]) = ternal workings by adding new transformation passes at different Vector.fromArray(data.zipWith(that.data)(_ + _)) ... points in the compile chain or adding new intermediate represen- } tation (IR) types. None of these mechanisms alone is sufficient to // Matrices handle the challenges posed by high level data structures. This pa- abstract class Matrix[T:Numeric] { ... } per shows a novel way to combine them to yield benefits that are // Complex Numbers greater than the sum of the parts. case class Complex(re: Double, im: Double) { Instead of using staging merely as a front end, we implement in- def +(that: Complex) = Complex(re + that.re, im + that.im) ternal compiler passes using staging as well.
    [Show full text]
  • Exact Positioning of Data Approach to Memory Mapped Persistent Stores: Design, Analysis and Modelling
    Exact Positioning of Data Approach to Memory Mapped Persistent Stores: Design, Analysis and Modelling by Anil K. Goel A thesis presented to the University of Waterloo in fulfilment of the thesis requirement for the degree of Doctor of Philosophy in Computer Science Waterloo, Ontario, Canada, 1996 c Anil K. Goel 1996 I hereby declare that I am the sole author of this thesis. I authorize the University of Waterloo to lend this thesis to other institutions or indi- viduals for the purpose of scholarly research. I further authorize the University of Waterloo to reproduce this thesis by photocopy- ing or by other means, in total or in part, at the request of other institutions or individuals for the purpose of scholarly research. iii The University of Waterloo requires the signatures of all persons using or photocopy- ing this thesis. Please sign below, and give address and date. v Abstract One of the primary functions of computers is to store information, i.e., to deal with long lived or persistent data. Programmers working with persistent data structures are faced with the problem that there are two, mostly incompatible, views of structured data, namely data in primary and secondary storage. Traditionally, these two views of data have been dealt with independently by researchers in the programming language and database communities. Significant research has occurred over the last decade on efficient and easy-to-use methods for manipulating persistent data structures in a fashion that makes the sec- ondary storage transparent to the programmer. Merging primary and secondary storage in this manner produces a single-level store, which gives the illusion that data on sec- ondary storage is accessible in the same way as data in primary storage.
    [Show full text]