A method for scheduling work units in a heterogeneous multi-core architecture comprising: analyzing instructions of a first compute kernel during compilation; maintaining a first count of branch instructions in the first compute kernel; instrumenting an identified branch instruction responsive to the branch instruction satisfies a filtering condition; determining a direction of the identified branch instruction associated with data of a plurality of first work units corresponding to the first compute kernel; maintaining a second count of times branch instructions have a given direction among the plurality of first work units; scheduling the plurality of first work units corresponding to the first compute kernel to a first processor core of a plurality of processor cores based at least in part on pre-runtime information determined during compilation of the first compute kernel, said pre-runtime information indicating each of the first count and the second count exceeds a respective threshold, wherein the first processor core has a first micro-architecture; receiving measured runtime information corresponding to runtime behavior of a portion of the instrumented instructions of the first compute kernel on the first processor core; and rescheduling work units of the plurality of first work units corresponding to the first compute kernel from the first processor core to a second processor core of the plurality of processor cores based at least in part on the measured runtime information indicating only the first count and not the second count exceeds its respective threshold, and wherein the second processor core has a second micro-architecture different from the first micro-architecture. analyzing instructions of a first compute kernel during compilation; maintaining a first count of branch instructions in the first compute kernel; instrumenting an identified branch instruction responsive to the branch instruction satisfies a filtering condition; determining a direction of the identified branch instruction associated with data of a plurality of first work units corresponding to the first compute kernel; maintaining a second count of times branch instructions have a given direction among the plurality of first work units; scheduling the plurality of first work units corresponding to the first compute kernel to a first processor core of a plurality of processor cores based at least in part on pre-runtime information determined during compilation of the first compute kernel, said pre-runtime information indicating each of the first count and the second count exceeds a respective threshold, wherein the first processor core has a first micro-architecture; receiving measured runtime information corresponding to runtime behavior of a portion of the instrumented instructions of the first compute kernel on the first processor core; and rescheduling work units of the plurality of first work units corresponding to the first compute kernel from the first processor core to a second processor core of the plurality of processor cores based at least in part on the measured runtime information indicating only the first count and not the second count exceeds its respective threshold, and wherein the second processor core has a second micro-architecture different from the first micro-architecture.