1. A method of storing thread execution data in a stack, comprising: receiving the thread execution data; storing the thread execution data in a first entry of the stack; updating a stack cache entry count that indicates the number of entries in a combination of the stack and a remote memory that store pushed thread execution data; marking the first entry as valid and dirty; updating a head entry pointer to point to the first entry of the stack; determining, based on the number of entries in the stack that are marked as valid and dirty and after storing the thread execution data in the first entry of the stack, that a first portion of the stack should be moved from the stack to the remote memory and marked as clean, wherein the first portion of the stack is moved when the number of entries that are marked as valid and dirty is less than the number of entries in the stack; moving the first portion of the stack to the remote memory and marking entries in the first portion of the stack as clean; and popping a second entry from the first portion of the stack without restoring the second entry from the remote memory when the second entry is marked as clean and valid.