A method, comprising: receiving an incoming instruction sequence using a global front end; grouping instructions from the instruction sequence to form instruction blocks, allocating the instruction blocks to a scheduler array, wherein instruction blocks from different threads are interleaved in the scheduler array; executing the instruction blocks; and retiring the instruction blocks from the scheduler array, characterized in that: each thread is associated with a respective thread pointer map, and entries in a thread pointer map are allocated to instruction blocks of a respective thread; wherein each thread includes a respective allocation counter that counts instruction blocks of the thread which are allocated to the scheduler array, and that includes a threshold; wherein the allocation counters are initially set to a same threshold, and a ratio of the thresholds is adjusted in favor of a progressing thread if another thread progresses slowly due to a L2 cache miss, wherein upon retirement of instruction blocks of a slow thread, thread pointer map entries corresponding to these instruction blocks are made available to progressing threads, wherein the allocation of the instruction blocks per thread to the scheduler array is based on the threshold of each thread. receiving an incoming instruction sequence using a global front end; grouping instructions from the instruction sequence to form instruction blocks, allocating the instruction blocks to a scheduler array, wherein instruction blocks from different threads are interleaved in the scheduler array; executing the instruction blocks; and retiring the instruction blocks from the scheduler array, characterized in that: each thread is associated with a respective thread pointer map, and entries in a thread pointer map are allocated to instruction blocks of a respective thread; wherein each thread includes a respective allocation counter that counts instruction blocks of the thread which are allocated to the scheduler array, and that includes a threshold; wherein the allocation counters are initially set to a same threshold, and a ratio of the thresholds is adjusted in favor of a progressing thread if another thread progresses slowly due to a L2 cache miss, wherein upon retirement of instruction blocks of a slow thread, thread pointer map entries corresponding to these instruction blocks are made available to progressing threads, wherein the allocation of the instruction blocks per thread to the scheduler array is based on the threshold of each thread. each thread is associated with a respective thread pointer map, and entries in a thread pointer map are allocated to instruction blocks of a respective thread; wherein each thread includes a respective allocation counter that counts instruction blocks of the thread which are allocated to the scheduler array, and that includes a threshold; wherein the allocation counters are initially set to a same threshold, and a ratio of the thresholds is adjusted in favor of a progressing thread if another thread progresses slowly due to a L2 cache miss, wherein upon retirement of instruction blocks of a slow thread, thread pointer map entries corresponding to these instruction blocks are made available to progressing threads, wherein the allocation of the instruction blocks per thread to the scheduler array is based on the threshold of each thread. thresholds is adjusted in favor of a progressing thread if another thread progresses slowly due to a L2 cache miss, wherein upon retirement of instruction blocks of a slow thread, thread pointer map entries corresponding to these instruction blocks are made available to progressing threads, wherein the allocation of the instruction blocks per thread to the scheduler array is based on the threshold of each thread.