1. A method to execute requests for data from a plurality of banks of a memory, comprising: segregating a plurality of threads of one or more application programs into a first group of threads and a second group of threads based on how efficiently the first group of threads operate with each other and how efficiently the second group of threads operate with each other; each thread of the first group of threads issuing first requests associated with at least one first thread request type for the data from the memory, and each thread of the second group of threads issuing second requests associated with at least one second thread request type for data from the memory; forming a first batch of requests, the first batch of requests including the first requests, wherein: the forming of the first batch of requests comprises, for a first marking-cap of a number of requests issued by each thread of the first group of threads for each bank of the memory, setting the first marking-cap based on the first thread request type and based on limits on the number of requests issued by each thread to each memory bank of the memory within the first batch; and batching the first marking-cap number of requests issued by each thread of the first group of threads; executing the first requests of the first batch of requests for the first thread request type for the data from the memory; forming a second batch of requests, the second batch of requests including the second requests, wherein: the forming of the second batch of requests comprises, for a second marking-cap number of requests issued by each thread of the second group of threads for each bank of the memory, setting the second marking-cap based on the second thread request type and based on limits on the number of requests issued by each thread to each memory bank of the memory within the second batch; and batching the second marking-cap number of requests issued by each thread of the second group of threads; executing the second requests of the second batch of requests for the second thread request type for the data from the memory wherein the executing of the first requests of the first batch occurs before the executing of the second requests of the second batch.