A method for balancing a workload on heterogeneous processing devices, comprising: storing a plurality of tasks in a shared queue that is communicatively connected to one or more first processors of a first type and one or more second processors of a second type, wherein each of the plurality of tasks include a first pointer to microcode for execution on the one or more first processors and a second pointer to compiled code for execution on the one or more second processors, wherein each of the one or more first processors include: a first dequeuing module, and one or more first processing cores; wherein each of the one or more second processors include: a synchronization module, a second dequeuing module, and one or more second processing cores; synchronizing, by at least one synchronization module of the one or more second processors, access to the shared queue by the first dequeuing module of each of the one or more first processors and the second dequeuing module of each of the one or more second processors utilizing an atomic operation for synchronization; reading, by at least one second dequeuing module of the one or more second processors, a particular task from among the plurality of tasks; dequeuing, by the at least one second dequeuing module of the one or more second processors, the particular task from the shared queue on a condition that the particular task is suitable for execution on the one or more second processors; instructing, by the at least one second dequeuing module of the one or more second processors, the one or more second processing cores to execute the compiled code pointed to by the second pointer. a first dequeuing module, and one or more first processing cores; wherein each of the one or more second processors include: a synchronization module, a second dequeuing module, and one or more second processing cores; synchronizing, by at least one synchronization module of the one or more second processors, access to the shared queue by the first dequeuing module of each of the one or more first processors and the second dequeuing module of each of the one or more second processors utilizing an atomic operation for synchronization; reading, by at least one second dequeuing module of the one or more second processors, a particular task from among the plurality of tasks; dequeuing, by the at least one second dequeuing module of the one or more second processors, the particular task from the shared queue on a condition that the particular task is suitable for execution on the one or more second processors; instructing, by the at least one second dequeuing module of the one or more second processors, the one or more second processing cores to execute the compiled code pointed to by the second pointer. a synchronization module, a second dequeuing module, and one or more second processing cores; synchronizing, by at least one synchronization module of the one or more second processors, access to the shared queue by the first dequeuing module of each of the one or more first processors and the second dequeuing module of each of the one or more second processors utilizing an atomic operation for synchronization; reading, by at least one second dequeuing module of the one or more second processors, a particular task from among the plurality of tasks; dequeuing, by the at least one second dequeuing module of the one or more second processors, the particular task from the shared queue on a condition that the particular task is suitable for execution on the one or more second processors; instructing, by the at least one second dequeuing module of the one or more second processors, the one or more second processing cores to execute the compiled code pointed to by the second pointer.