An apparatus comprising: a graphics processor comprising: a compute unit having a single instruction, multiple thread architecture, the compute unit configured to execute multiple concurrent threads; a thread dispatcher configured to dispatch a thread for execution by the compute unit; and a memory coupled with the compute unit and on a same integrated circuit as the compute unit, the memory configured to store thread state information for a suspended thread, wherein the compute unit is configured to: detect that all threads on the compute unit are blocked from execution, in response to detecting that all threads on the compute unit are blocked from execution, perform the following: select a victim thread from the multiple concurrent threads, suspend the victim thread, store thread state information of the victim thread to a set of suspended threads within the memory, store, for the victim thread, the reason that the victim thread was blocked, wherein the reason is waiting on a page fault or waiting on a barrier, and request the thread dispatcher to dispatch an additional thread to the compute unit to replace the victim thread and continue execution on the compute unit, wherein the compute unit is further configured to, when an executing thread is finished, determine if a suspended thread is stored in the set of suspended threads and if yes, restore the suspended thread in the compute unit instead of signaling the thread dispatcher to dispatch a new thread. a graphics processor comprising: a compute unit having a single instruction, multiple thread architecture, the compute unit configured to execute multiple concurrent threads; a thread dispatcher configured to dispatch a thread for execution by the compute unit; and a memory coupled with the compute unit and on a same integrated circuit as the compute unit, the memory configured to store thread state information for a suspended thread, a compute unit having a single instruction, multiple thread architecture, the compute unit configured to execute multiple concurrent threads; a thread dispatcher configured to dispatch a thread for execution by the compute unit; and a memory coupled with the compute unit and on a same integrated circuit as the compute unit, the memory configured to store thread state information for a suspended thread, wherein the compute unit is configured to: detect that all threads on the compute unit are blocked from execution, in response to detecting that all threads on the compute unit are blocked from execution, perform the following: select a victim thread from the multiple concurrent threads, suspend the victim thread, store thread state information of the victim thread to a set of suspended threads within the memory, store, for the victim thread, the reason that the victim thread was blocked, wherein the reason is waiting on a page fault or waiting on a barrier, and request the thread dispatcher to dispatch an additional thread to the compute unit to replace the victim thread and continue execution on the compute unit, wherein the compute unit is further configured to, when an executing thread is finished, determine if a suspended thread is stored in the set of suspended threads and if yes, restore the suspended thread in the compute unit instead of signaling the thread dispatcher to dispatch a new thread. detect that all threads on the compute unit are blocked from execution, in response to detecting that all threads on the compute unit are blocked from execution, perform the following: select a victim thread from the multiple concurrent threads, suspend the victim thread, store thread state information of the victim thread to a set of suspended threads within the memory, store, for the victim thread, the reason that the victim thread was blocked, wherein the reason is waiting on a page fault or waiting on a barrier, and request the thread dispatcher to dispatch an additional thread to the compute unit to replace the victim thread and continue execution on the compute unit, select a victim thread from the multiple concurrent threads, suspend the victim thread, store thread state information of the victim thread to a set of suspended threads within the memory, store, for the victim thread, the reason that the victim thread was blocked, wherein the reason is waiting on a page fault or waiting on a barrier, and request the thread dispatcher to dispatch an additional thread to the compute unit to replace the victim thread and continue execution on the compute unit, wherein the compute unit is further configured to, when an executing thread is finished, determine if a suspended thread is stored in the set of suspended threads and if yes, restore the suspended thread in the compute unit instead of signaling the thread dispatcher to dispatch a new thread.