  Modern program runtime is dominated by segments of repeating code called
kernels. Kernels are accelerated by increasing memory locality, increasing
data-parallelism, and exploiting producer-consumer parallelism among kernels -
which requires hardware specialized for a particular class of kernels.
Programming this hardware can be difficult, requiring that the kernels be
identified and annotated in the code or translated to a domain-specific
language. This paper describes a technique to automatically localize parallel
kernels from a dynamic application trace, facilitating further code
optimization.
  Dynamic trace collection is fast and compact. With optimization, it only
incurs a time-dilation of a factor on nine and file-size of one megabyte per
second, addressing a significant criticism of this approach. Kernel extraction
is accurate and performed in linear time within logarithmic memory, detecting a
wide range of kernels. This approach was validated across 16 libraries,
comprised of 10,507 kernels instances. To validate the accuracy of our detected
kernels, five test programs were written that spans traditional kernel
definitions and were certified to contain all the kernels that were expected.
