Analyzing the trade-off between multiple memory controllers and memory channels on multi-core processor performance