77 lines
2.9 KiB
C++
77 lines
2.9 KiB
C++
// Copyright 2024 KVCache.AI
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef MEMORY_LOCATION_H
|
|
#define MEMORY_LOCATION_H
|
|
|
|
#include <glog/logging.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "common.h"
|
|
|
|
const int pagesize = 4096;
|
|
|
|
namespace mooncake {
|
|
struct MemoryLocationEntry {
|
|
uint64_t start;
|
|
size_t len;
|
|
std::string location;
|
|
};
|
|
|
|
// If only_first_page is true, only the location of the first page will be
|
|
// returned. Scan all pages may take a long time, so set only_first_page if only
|
|
// the location of the first page is needed.
|
|
const std::vector<MemoryLocationEntry> getMemoryLocation(void *start,
|
|
size_t len,
|
|
bool only_first_page);
|
|
|
|
const static std::string kWildcardLocation = "*";
|
|
const static std::string kSegmentsLocationPrefix = "segments:";
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
/* Segments location encoding */
|
|
/* */
|
|
/* Format: "segments:<page_size>:<numa0>,<numa1>,..." */
|
|
/* Example: "segments:4096:1,3,5,7" */
|
|
/* */
|
|
/* The buffer is divided into N equal regions (N = number of nodes). */
|
|
/* Region i is physically bound to NUMA node numa[i]. */
|
|
/* Given an offset within the buffer: */
|
|
/* region_index = offset / (buffer_length / N) */
|
|
/* numa_node = numa[region_index] */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
struct SegmentsLocationInfo {
|
|
size_t page_size;
|
|
std::vector<int> numa_nodes;
|
|
};
|
|
|
|
// Build a segments location string for buffer registration.
|
|
std::string buildSegmentsLocation(size_t page_size,
|
|
const std::vector<int> &numa_nodes);
|
|
|
|
// Parse a "segments:..." location string. Returns false on bad format.
|
|
bool parseSegmentsLocation(const std::string &name, SegmentsLocationInfo &info);
|
|
|
|
// Resolve the actual "cpu:N" location for a given offset within a
|
|
// segments-encoded buffer.
|
|
std::string resolveSegmentsLocation(const SegmentsLocationInfo &info,
|
|
uint64_t buffer_length, uint64_t offset);
|
|
|
|
} // namespace mooncake
|
|
|
|
#endif // MEMORY_LOCATION_H
|