AFAIK ist Speicher am PC immer gleich schnell angebungen. Wenn man Module mit unterschiedlichen Geschwindigkeiten verwendet wird immer die Geschwindigkeit des langsamsten Moduls verwendet. Und wenn man z.B. 2x 512 MB dual channel hat und dann ein 3. MB Modul dazusteckt ... theoretisch könnte der Controller dann die ersten beiden Module immer noch dual channel anfahren und das 3. Modul eben single channel - würde mich aber wundern wenn ein Controller das könnte. Und selbst wenn: das ist eine Sache um die sich das OS zu kümmern hat. Weil das Beispiel AMIGA erwähnt wurde: am AMIGA gibt es aus genau dem Grund RAM Prioritäten, und FAST-RAM hat eine höhere Priorität als CHIP-RAM. Solange noch genügend FAST-RAM frei ist bekommt man also auch FAST-RAM, es sei denn man fordert ausdrücklich CHIP-RAM an. (lokales RAM auf Turbokarten kommt als erstes, dann ZORRO-3 FAST-RAM, dann ZORRO-2 FAST-RAM und dann irgendwann CHIP-RAM.)
Eine bestimmten Adressbereich (virtuelle Adressen!) kann man normalerweise anfordern, nur ist nicht gesagt dass dieser frei ist. Im Allgemeinen sollte man das aber dem OS überlassen.
Ansonsten: wirklich viel bringt es nur wenn man dafür sorgt dass Zugriffe direkt hintereinander erfolgen, also nicht nur nahe zusammen sondern quasi "ohne ein Byte auszulassen". (OK, real kann man ein paar Bytes auslassen, aber man sollte keine ganze Cacheline auslassen.)
Und genau das kann man eigentlich nur sicherstellen wenn man den Speicher gleich als einen einzigen Block anfordert (Arrays etc.). Von daher ist es dann aber wieder egal wo der Speicher genau liegt - er liegt "am Stück", und das ist das einzige was wichtig ist.
Um den Rest soll sich der Allocator kümmern, also dass Speicheranforderungen eines Threads so nahe wie möglich beieinander bleiben.