| K. Pettis and R. C. Hansen, "Profile Guided Code Positioning, " Proceedings of the SIGPLAN Conference on Programming Language Design and Implementation, pp. 16--27, June 1990. |
....body of work on interprocedural dataflow analyses design to analyze only part, but not all, of a program (see, for example, 3, 5, 13, 26] although only some of them use profile information to guide their decisions. This profile information is, however, widely used when performing optimizations [24, 7, 10, 18]. On the other hand, while speculation has been commonly used in the compiler world for optimizing programs [19, 15, 20, 18, 25] as far as we know, this is the first attempt to introduce unsafe speculations into a dataflow analysis algorithm. 6. Summary and future directions greatly from ....
K. Pettis and R. C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
....with the goal of more efficiently using the instruction cache. Several compile time code placement techniques have been proposed that use heuristics and profile information to reduce the number of conflict misses in the primary (firstlevel or L1) instruction cache by reordering the program code [3, 18, 26, 27, 36]. Most of this work uses cache parameters such as cache size and line size as well as procedure sizes to accurately model the cache mapping of the code. The code placement algorithms typically use some kind of profile information to find a cache mapping that reduces cache conflict misses. These ....
....reduces cache conflict misses. These techniques typically achieve a noticeable reduction in the number of L1 instruction cache misses compared to the default code placement produced by the compiler. As an example of a popular code placement technique, we now introduce the work by Pettis and Hansen [27]. While their paper also contains techniques for basic block placement and branch alignment, we will focus on their procedure ordering algorithm; we return to issues of intra procedural code placement in Section 6.2. Pettis and Hansen s procedure placement technique is considered the reference ....
[Article contains additional citation context not shown here]
K. Pettis and R. Hansen, "Profile-guided code positioning." Proc. PLDI-90: ACM SIGPLAN `90: Conf. on Programming Language Design and Implementation, p.16, June 1990.
....profiling effectively to make static changes to a program that optimize its reference behavior. Profiling with MIN analysis has been used to annotate instructions for prefetching [Abraham 93] Other techniques restructure the layout of references, both data [Lebeck 94, Calder 98] and instructions [Pettis 90, Hashemi 97] However, the majority of the restructuring techniques have the goal of eliminating conflict misses in directmapped caches while my interest is in caches with larger set associativity. Variations on LRU [Smith 82] have been extensively studied, and recently there has been renewed ....
K. Pettis and R. Hansen. Profile Guided Code Positioning. In Proceedings of the ACM SIGPLAN `90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
....targets reduction of cache conflict misses rather than page faults. The former are easier to avoid if the architecture uses a separate instruction cache. It is also known that compiler optimizationinvoked code reordering sometimes unintentionally increases cache misses [7] Pettis and Hansen [15] used greedy clustering algorithms similar to those described by Johnson, but with the additional goal of arranging procedures within code blocks relative to each other. Gloy and Smith [7] proposed using temporal information, in a manner similar to our approach, for improving paging and ....
....5 8) Thus, it can assign f i to P l , even if f i has a stronger temporal association with f j , not assigned to P l . Thus, this method di#ers from agglomerative hierarchical clustering, since it does not always assign the two most temporally associated groups of functions to the same page [15]. pickFunction(G, F uncList, P, P l ) Space : P Z gives the space available in a page 1. 2. compute CScore(f i , P l ) FuncList based on CScore(f t , P l ) 4. if # f i FuncList such that 4. Size(f i ) Space(P l ) and CScore(f i , P l ) 0 5. increment P l 6. 7. ....
K. Pettis, R. Hensen. Profile-guided code positioning. In Conf. on Programming Language Design and Implementation, 1990.
....once, the program is compiled a second time, using the run time profile information to make better compile time optimization decisions. Feedback directed optimization has been particularly successful for optimizations that exploit locality of reference for a better use of the memory hierarchy [PH90, HKC97] and for procedure inlining [CL99] Link time optimization is another approach to compensate for the limited effectiveness of traditional compile time optimization. To be effective, link time optimization often has to reconstruct higher level control and data flow information to ensure ....
.... cache misses increased, for others they actually decreased (due to a reduction in the total number of instruction cache accesses) The second most successful feedback directed optimization in the Compaq study was code layout, which used a slightly modified version of the Pettis and Hansen [PH90] algorithm. On average the layout optimization based on profile data improved performance by 4 , with a maximum of 20 for the vortex SPEC benchmark. The third optimization that sometimes benefited significantly from profile data was trace scheduling and superblock formation. On average it ....
[Article contains additional citation context not shown here]
Karl Pettis and Robert C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27, White Plains, NY, USA, 1990.
....techniques can be applied, in order to layout the loop code in such a way that the number of required tag bits for I cache conflict identification is minimized. Placing the loop code as close as possible is a basic technique for code positioning that aims to minimize the I cache miss rate [14]. Consequently, while our methodology does not directly modify the code layout, it can significantly benefit from code positioning techniques for I cache miss rate minimization. 4. APPLYING I CACHE TAG REDUCTION 4.1 Compile time support The methodology starts with application profiling in order ....
K. Pettis and R. C. Hansen, "Profile guided code positioning", in SIGPLAN, pp. 16--27, June 1990.
....is a cyclic phase ordering dependency between trace picking, code layout, and tail duplication. The StarJIT Itanium Processor Family code generator uses a novel scheme that performs all three together. The code layout technique is a top down scheme similar to that described by Pettis Hansen [17]. Code layout, trace formation, and tail duplication decisions all benefit from any available branch profile information. Code layout uses profiles to improve cache locality and reduce taken branches. Along hot paths the trace picker picks longer traces, and the tail duplicator is more aggressive ....
K. Pettis and R.C. Hansen, "Profile Guided Code Positioning," in proceedings of the ACM SIGPLAN 90 Conference on Programming Language Design and Implementation, White Plains, N.Y., June 20-22, 1990, pp. 16-27.
....procedure call. A return instruction (RET) can be considered a jump with special hint to use a return address stack to predict a target address. 4 25 beneficial to layout basic blocks in accordance with their most common dynamic execution order. Profile guided code positioning was introduced in [34] to move infrequently executed code out of the main body of the program and allow a higher fraction of instructions fetched into the Icache to be useful. This is done by rearranging code so that unconditional branches are removed and the fraction of not taken conditional branches is increased. ....
....Register indirect jumps varies between 0.5 to 3.2 of all instructions but their effect on performance are sometimes substantial as explained in later subsections. 1. 2Run time code straightening by dynamic optimizers translators A problem with the static code straightening techniques [28,34,36] is that they require profilebased optimization, and, in reality, not many programs are compiled this way. Actual run time behavior of program further reduces the effectiveness of the static code straightening characteristics of the same static control transfer instruction may be sensitive to ....
Karl Pettis and Robert C. Hansen, "Profile Guided Code Positioning," Proc. ACM SIGPLAN Conf. Programming Language Design and Implementation, Jun 1990.
....can minimize the dynamic instruction count along critical paths [71, 72] It can specialize procedures for common argument values. Using a calling context tree with actual branch percentages, it can optimize branches for the typical case and maximize cache locality by putting related code together [117, 87, 48]. It can utilize the actual execution frequencies to reorder if elseif constructs to put the most common cases at the top, and compile switch statements into a Huffman tree to minimize average lookup time [63] For hash tables, it can come up with a nearperfect hash function that is suited to the ....
....at each point in the dynamic region. 19 2.3 Profile driven optimization Profile driven optimization is a relatively new field. Some static compilers utilize profile information from prior test runs to perform better optimizations, for example, trace scheduling [79] improving cache locality [87, 117, 48, 128, 127], or traditional optimizations [35, 34, 36, 23] Profile driven optimizations have shown up in recent commercial products [89, 88, 131] There has been work on using profile information in dynamic compilers for Scheme [18, 17, 19] Self [61] Cecil [26] and ML [96, 101] More recently, the ....
[Article contains additional citation context not shown here]
Karl Pettis and Robert C. Hansen. Profile guided code positioning. SIGPLAN Notices, 25(6):16--27, June 1990. Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation.
....code scheduling. The only optimization we provide is code straightening where basic blocks are statically located in accordance with their most common dynamic execution order (with branch directions changed accordingly) This wellknown optimization, similar to static code layout techniques [24], captures much of the lowhanging fruit of dynamic optimization by improving instruction cache locality and branch prediction behavior. 1.3 Related work. Co designed virtual machines were studied in the IBM DAISY [7] and BOA [1] projects and implemented in the Transmeta Crusoe [19] all of which ....
Karl Pettis and Robert C. Hansen, "Profile Guided Code Positioning," Proc. ACM SIGPLAN Conf. Programming Language Design and Implementation, Jun 1990.
.... For example, profiling has long been used to find the most frequently executed subroutines of an application, so that a programmer might focus on optimizing those subroutines [10] Profiling has been used in compilers to map frequently executed code and data to non interfering cache regions [15] to improve performance. The approach in [8] proposes using profiling to generate alternate subroutine versions for common cases, with the program then using run time profiling to pick the best version. Likewise, the approach in [14] uses profiling Permission to make digital or hard copies of all ....
Pettis, K. and R.C. Hansen. Profile Guided Code Positioning. ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), June 1990.
....the cache when a change in configuration is required. Although this can help to keep useful sections of code in the cache, the technique is inflexible in how the cache can be allocated for different purposes and requires a potentially costly overhead in configuration. Software solutions also exist [18, 5, 6] which attempt to align code section in memory so that their degree of This work was supported by EPSRC grant GR L78970 overlap in the cache is lower than the associativity, hence improving the performance. These approaches are similar to software managed caches [8] which apply the same ideas ....
....that are executed only once, such as the initialisation assignments to n and da, will receive low scores. In the same way, functions which are called often, from a number of places or from within a loop, will receive high scores. This is similar to the work performed by Pettis and Hansen [18] and Ball and Larus [2] who utilise profiling information, instrumented by compiler style tools, to form relationships between code segments which describe their execution profile. By using profile based information exact results can be obtained for the execution of a given application run and the ....
K. Pettis and R.C. Hansen. Profile Guided Code Positioning. In ACM SIGPLAN Conference on Programming Language Design and Implementation, June 1990.
....to increase the pipeline utilization by filling the delay slots of conditional branches if they are likely to be taken, but not to avoid unconditional branches by code replication. Lately, several approaches have been made to change the positional order of basic blocks based on profiling data [Mc89,Pe90]. Code was restructured such that frequently executed chains of basic blocks follow one another positionally. Thus, the number of executed instructions was reduced by introducing transfers of control to infrequently executed portions of code in remote locations. Environment for Experimentation ....
....increases with the use of code replication. Thus, it becomes easier to fill delay slots for certain reduced instructions which improves the utilization of an instruction pipeline. Lately, several attempts have been made to reorganize the positional order of basic blocks based on profiling data [Mc89,Pe90]. Code replication could take advantage of profiling data in two ways. First, the selection of basic blocks for a replication sequence can be modified to favor frequently executed blocks rather than the shortest path. Second, profiling data can be used to decide if a particular replication should ....
K. Pettis, R. C. Hansen, Profile Guided Code Positioning, Proceedings of the ACM SIGPLAN 1990 Conference on Programming Language Design and Implementation, Vol. 25, No. 6, June 1990, pp. 16-27
.... For example, profiling has long been used to find the most frequently executed subroutines of an application, so that a programmer might focus on optimizing those subroutines [9] Profiling has been used in compilers to map frequently executed code and data to non interfering cache regions [14] to improve performance. The approach in [7] proposes using profiling to generate alternate subroutine versions for common cases, with the program then using run time profiling to pick the best version. Likewise, the approach in [13] uses profiling Permission to make digital or hard copies of all ....
Pettis, K. and R.C. Hansen. Profile Guided Code Positioning. ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), June 1990.
....have large effects on program performance. Thus, adding randomization to the layout optimizer can facilitate performance evaluation not only of the program and the rest of the compiler, but of the layout optimizer itself. The canonical approach to layout optimization is due to Pettis and Hansen [45]. The basic P H procedure positioning scheme uses a call graph profile. First, the program is instrumented to record all procedure calls. Considering the procedures to be nodes of a graph, weights are assigned to edges according to how many times a call occurred between pairs of procedures. Then, ....
K. Pettis and R. Hansen. Profile GUided Code Positioning. In Proceedings of the Third International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS). pp 242-251. May, 1989.
....program. The first, and most obvious, is that there may be differences in register usage and branch labels. Differences in the actual sequence of instructions produced may also arise due to instruction scheduling, or because of profile directed code layout to improve instruction cache utilization [13]. This paper describes a somewhat different approach to code compression. Instead of treating a program as a simple linear sequence of instructions, we work with its (interprocedural) control flow graph. Instead of using a suffix tree construction to identify repeated instruction sequences, we ....
K. Pettis and R. C. Hansen, "Profile-Guided Code Positioning", Proc. SIGPLAN '90 Conference on Programming Language Design and Implementation, June 1990, pp. 16--27.
....overwhelm the benefit of using hybrid programs. The effect of procedure placement in hybrid programs is illustrated in Figure 6.3. The effects of procedure placement on performance can be significant. Pettis and Hansen noted that a good procedure placement could improve execution time by up to 10 [Pettis90]. To our knowledge, we are the first to report on the effect of procedure placement on selective compression. Procedure placement is likely to affect selective compression in other compression systems too. For example, IBM s hardware implementation of CodePack also uses compressed and native code ....
K. Pettis and R. Hansen, "Profile Guided Code Positioning", Proceed- ings of the ACM SIGPLAN'90 Conference on Programming Language Design and Implementation (PLDI), pp. 16-27, June 1990.
....using separate compilation, that is, one or a few files at a time. Therefore, the compiler does not have the opportunity to optimize the full program as a whole, even performing sophisticated inter procedural analysis. A second reason is the emergence of profile directed compilation techniques [12, 7]. However, the same problem of separate compilation plagues the use of profile feedback: large projects will be forced to re build every file to take advantage of the profiling information. Link time optimizations are able to re optimize the final binary using profile data without recompiling ....
K. Pettis and R. C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
.... AND LATENCY MODEL: A AREA, L LATENCY [13] conflict misses in large direct mapped instruction caches has been proposed [3] Static code repositioning by using cache line coloring at the procedure or basic block level has been an alternative approach proposed and evaluated in [12] 13] and [27]. Similar technique for profile driven data repositioning has been proposed in [26] III. PERFORMANCE MODELING In this section, we describe the hardware performance models for caches and processor cores. Three factors combine to influence system performance: cache miss rates, processor ....
K. Pettis and R. C. Hansen, "Profile guided code positioning," in Proc. Conf. Programming Language Design and Implementation, vol. 25, 1990, no. 6, pp. 16--27.
....mechanism for replacing the code of almost any kernel function with an alternate implementation, enabling installation of run time optimizations. As a proof of concept, we demonstrate a dynamic kernel optimization with an implementation of Pettis and Hansen s code positioning I cache optimizations [17] that previously had been applied only statically and only to user level programs. We applied code positioning to TCP kernel code in UltraSPARC Solaris 7 while running a Web client benchmark, reducing the ratio of CPU time that the TCP read side processing routine (tcp rput data) spent idled due ....
....dividing the maximum allowable value among the unknown edges. However, since edge counts can usually be precisely derived, approximation is seldom needed, making the issue relatively unimportant. 5. 2 An Example Figure 3 contains a control flow graph that was used in Pettis and Hansen s paper [17] to demonstrate why edge measurements are more useful than block measurements. In this example, edge counts can be precisely derived from block counts, as follows. First, block B has only one predecessor edge (A,B) and only one successor edge (B,D) whose execution counts must equal B s count ....
[Article contains additional citation context not shown here]
K. Pettis and R.C. Hansen. Profile Guided Code Positioning. ACM SIGPLAN '90 Conference on Programming Language Design and Implementation (PLDI), White Plains, NY, June 1990.
....the important fields are located next to each other in memory space and in the cache for better performance. Separating fields in class files according to the predicted usage patterns improves data memory locality in the same manner as procedure splitting improves code memory performance [66]. As a side effect, we achieve advantages in memory performance using our class file splitting technique. However, since memory performance is not the focus of this thesis, we did not investigate it and do not provide measurements for it. In other work by Lee et al. 53] the authors describe a ....
....working set model [20] More recently, as memory sizes have increased, interest has shifted to improving both temporal and spatial locality for all levels of memory. Many software techniques have been developed for improving instruction cache performance. Techniques such as basic block reordering [37, 66], function grouping [26, 31, 37, 66] reordering based on control structure [60] and reordering of system code [83] have all been shown to significantly improve instruction cache performance. The increasing latency of second level caches means that expensive cache usage patterns, such as ....
[Article contains additional citation context not shown here]
K. Pettis and R. Hansen. Profile guided code positioning. Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, 25(6):16-- 27, June 1990.
....counts, is the most important, especially for integer programs. The second use, delaying register reuse, is more important for floating point programs where scheduling for long operation latency is important. 3. 7 Code layout Our code layout algorithm is essentially the same as Pettis and Hansen [4,5,6,9]. Its goal is to reduce instruction cache misses and improve instruction fetch by using profile information to guide the layout of code in memory. We found that the algo # # Figure 4: Function from xlisp where rarely called is useful 6 rithm worked well, except in its handling of branches for ....
K. Pettis and R. Hansen, "Profile Guided Code Positioning, " Proceedings of the ACM SIGPLAN'90 Conference on Programming Language Design and Implementation, White Plains, N.Y. (June 1990): 16-27.
....are based solely on the final object representation have the attraction of being able to work on a full program basis and be fully integrated on a normal compilebuild test cycle. A second reason for the recent interest in binary optimization has been the emergence of profile directed feedback [22, 7, 10, 13]. As it has been shown in several studies [3, 4] the compiler can use to great advantage the profiling information. However, the same problem of separate compilation plagues the production use of profile feedback. If the profiling information has to be used when compiling, then a large project ....
K. Pettis and R. C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
....the call site is altered to directly call the optimized version of the function. A second example of run time code optimization that can be performed with dynamic instrumentation is code positioning, or moving seldom executed basic blocks out of line to improve 4 instruction cache performance [61, 69]. First, a function can be tested for poor instruction cache performance by inserting instrumentation that measures the number of icache misses incurred. After a time, the instrumentation is removed, and if instruction cache performance is poor, the function s basic blocks are instrumented for ....
....of decoupling code generation from the mechanism for inserting such code into a running kernel. The second contribution is the design of a prototype run time kernel optimizer aimed at improving instruction cache performance of kernel code. It uses Pettis and Hansen s code positioning optimization [69] that reorders basic blocks to improve instruction cache performance. Although the speedups achieved thus far are small compared to a user level evolving system that implements a full range of compiler optimizations at run time [5] the implementation demonstrates an infrastructure for run time ....
[Article contains additional citation context not shown here]
K. Pettis and R.C. Hansen. Profile Guided Code Positioning. ACM SIGPLAN '90 Conference on Programming Language Design and Implementation (PLDI), White Plains, NY, June 1990.
No context found.
K. Pettis and R. C. Hansen, "Profile Guided Code Positioning, " Proceedings of the SIGPLAN Conference on Programming Language Design and Implementation, pp. 16--27, June 1990.
No context found.
Pettis, K. and Hansen, R. C. Profile Guided Code Positioning. Proceedings of the ACM-SIGPLAN 1990 Conference on Programming Language Design and Implementation, 25, 6 (June 20-22, 1990), 16--27.
No context found.
Pettis, K., Hansen, R. Profile guided code positioning. Proceedings of the ACM SIGPLAN conference on Programming Language Design and Implementation, 1990.
No context found.
K. Pettis and R. C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN'90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
No context found.
K. Pettis and R. C. Hansen, "Profile guided code positioning," ACM SIGPLAN Notices, vol. 25, no. 6, pp. 16--27, June 1990.
No context found.
K. Pettis and R. Hansen. "Profile Guided Code Positioning," Proceedings of SIGPLAN `90 Conference on Programming Language Design and Implementation, ACM, pp. 16-27, June 1990.
No context found.
Pettis, K. and R.C. Hansen. Profile Guided Code Positioning. ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), June 1990.
No context found.
K. Pettis and R. C. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
No context found.
K. Pettis and R. C. Hansen, "Profile-Guided Code Positioning", Proc. SIGPLAN '90 Conference on Programming Language Design and Implementation, June 1990, pp. 16--27.
No context found.
K. Pettis and R. Hansen. Profile guided code positioning. Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, 25(6):16-- 27, June 1990.
No context found.
K. Pettis, R. Hansen, " Profile Guided Code Positioning," in Proceedings on the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pp. 16-27, June 1990.
No context found.
K. Pettis and D. Hansen. Profile guided code positioning. In Proceedings of the SIGPLAN ' 90 Conference on Program Language Design and Implementation, White Plains, NY, June 1990.
No context found.
K. Pettis and R. Hansen. Profile-guided code positioning. In Proceedings of the 1995.
No context found.
K. Pettis and R. C. Hansen, "Profile guided code positioning," ACM SIGPLAN Notices, vol. 25, no. 6, pp. 16--27, June 1990, published as part of the proceedings of PLDI'90.
No context found.
K. Pettis and R. C. Hansen. Profile guided code positioning. Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, 25(6):16--27, June 1990.
No context found.
K. Pettis and R. C. Hansen, "Profile Guided Code Positioning," in Proceedings of the ACM SIGPLAN 1990.
No context found.
K. Pettis and R. C. Hansen. Profile-guided code positioning. In Proc. ACM SIGPLAN Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
No context found.
K. Pettis and D. Hansen. Profile guided code positioning. In Proceedings of the SIGPLAN 1990.
No context found.
K. Pettis and R. C. Hansen. Profile-guided code positioning. In Proc. ACM SIGPLAN Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
No context found.
K. Pettis and R. C. Hansen. Profile Guided Code Positioning. In Proc. ACM SIGPLAN 1990.
No context found.
K. Pettis and R. C. Hansen, "Profile-Guided Code Positioning", Proc. SIGPLAN '90 Conference on Programming Language Design and Implementation, June 1990, pp. 16--27.
No context found.
K. Pettis and R. C. Hansen. "Profile guided code positioning," Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, 1990.
No context found.
K. Pettis and R. Hansen. Profile guided code positioning. In Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pages 16--27. ACM, ACM, June 1990.
No context found.
K. Pettis and R. C. Hansen. Profile-guided code positioning. In Proc. ACM SIGPLAN Conference on Programming Language Design and Implementation, pages 16--27, June 1990.
No context found.
Pettis, Karl, and Robert C. Hansen, "Profile Guided Code Positioning." Proceedings of ACM SIGPLAN'90 Conference on Programming Language Design and Implementation (June, 1990) pp. 16-27.
No context found.
K. Pettis and R. Hansen, "Profile Guided Code Positioning," Proceedings of the ACM SIGPLAN'90 Conference on Programming Language Design and Implementation, White Plains, N.Y. (June 1990): 16--27.
First 50 documents Next 50
Online articles have much greater impact More about CiteSeer.IST Add search form to your site Submit documents Feedback
CiteSeer.IST - Copyright Penn State and NEC