A more optimized version of the set function. It only touch the first byte on
each page. Anyway, this function is _NEVER_ called as we use bind instead of set. So please don't rely on the first touch memory affinity to do the right thing. This commit was SVN r20917.
Этот коммит содержится в:
родитель
6ca6cfaafc
Коммит
d10393a925
@ -19,13 +19,12 @@
|
|||||||
#include "opal_config.h"
|
#include "opal_config.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stddef.h>
|
||||||
#include "opal/constants.h"
|
#include "opal/constants.h"
|
||||||
#include "opal/mca/maffinity/maffinity.h"
|
#include "opal/mca/maffinity/maffinity.h"
|
||||||
#include "opal/mca/maffinity/base/base.h"
|
#include "opal/mca/maffinity/base/base.h"
|
||||||
#include "maffinity_first_use.h"
|
#include "maffinity_first_use.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local functions
|
* Local functions
|
||||||
*/
|
*/
|
||||||
@ -71,15 +70,24 @@ static int first_use_module_set(opal_maffinity_base_segment_t *segments,
|
|||||||
size_t num_segments)
|
size_t num_segments)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
uintptr_t pagesize = (uintptr_t)sysconf(_SC_PAGESIZE);
|
||||||
/* Crude: zero out all the segments that belong to me. We could
|
volatile char useless;
|
||||||
probably get away with touching a byte in each page (which
|
|
||||||
would potentially be much faster), but this is during setup so
|
|
||||||
it's not a huge deal. Consider this a target for future
|
|
||||||
optimization... */
|
|
||||||
|
|
||||||
for (i = 0; i < num_segments; ++i) {
|
for (i = 0; i < num_segments; ++i) {
|
||||||
memset(segments[i].mbs_start_addr, 0, segments[i].mbs_len);
|
char* ptr = (char*)segments[i].mbs_start_addr;
|
||||||
|
char* end_ptr = ptr + segments[i].mbs_len;
|
||||||
|
|
||||||
|
/* Let's touch the first byte of the segment. If this is the
|
||||||
|
* first byte on the memory page, good. If not, at least it
|
||||||
|
* will not overwrite anything important.
|
||||||
|
*/
|
||||||
|
useless = ptr[0];
|
||||||
|
/* Compute the address of the first byte on the next page */
|
||||||
|
ptr = (char*)((uintptr_t)(ptr + pagesize) & ~pagesize);
|
||||||
|
while( ptr <= end_ptr) {
|
||||||
|
useless += ptr[0];
|
||||||
|
ptr += pagesize;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return OPAL_SUCCESS;
|
return OPAL_SUCCESS;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user