A program is into at least two object files: one object file for each of
the supported processor environments. During compilation, code
characteristics, such as data locality, computational intensity, and data
parallelism, are analyzed and recorded in the object file. During run
time, the code characteristics are combined with runtime considerations,
such as the current load on the processors and the size of the data being
processed, to arrive at an overall value. The overall value is then used
to determine which of the processors will be assigned the task. The
values are assigned based on the characteristics of the various
processors. For example, if one processor is better at handling intensive
computations against large streams of data, programs that are highly
computationally intensive and process large quantities of data are
weighted in favor of that processor. The corresponding object is then
loaded and executed on the assigned processor.