mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-09-27 12:52:29 +08:00

Some checks failed
CE Compile Job / ce_job_pre_check (push) Has been cancelled
CE Compile Job / print_ce_job_pre_check_outputs (push) Has been cancelled
CE Compile Job / FD-Clone-Linux (push) Has been cancelled
CE Compile Job / Show Code Archive Output (push) Has been cancelled
CE Compile Job / BUILD_SM8090 (push) Has been cancelled
CE Compile Job / BUILD_SM8689 (push) Has been cancelled
CE Compile Job / CE_UPLOAD (push) Has been cancelled
* [feat] support clearing prefix cache (cherry-picked from release/2.1) * [fix] fix ipc suffix, use port instead * [fix] fix prefix caching not enabled * [fix] fix code style * [fix] wait for rank0 to update weight status
72 lines
2.5 KiB
Plaintext
72 lines
2.5 KiB
Plaintext
// Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
|
||
//
|
||
// 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.
|
||
|
||
#include "helper.h"
|
||
#include "cuda_multiprocess.h"
|
||
|
||
#if !defined(_WIN32)
|
||
#include <errno.h>
|
||
#include <string.h>
|
||
#include <fcntl.h>
|
||
#include <sys/mman.h>
|
||
#include <sys/stat.h>
|
||
#endif
|
||
|
||
// 可选:仅删除/解除共享内存命名对象(不依赖之前保存的 addr/fd)
|
||
static inline int sharedMemoryUnlinkByName(const char* name) {
|
||
#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
|
||
// Windows 上没有 shm_unlink 语义。命名对象在最后一个句柄关闭后消失。
|
||
// 这里做“尽力而为”:尝试打开后立即关闭,减少一次引用。
|
||
HANDLE hMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, name);
|
||
if (hMap) {
|
||
CloseHandle(hMap);
|
||
return 0;
|
||
}
|
||
// 已经不存在也算成功
|
||
return 0;
|
||
#else
|
||
// POSIX: 移除名字,未来不可再 open;已映射区仍存活直至 munmap
|
||
if (shm_unlink(name) != 0) {
|
||
if (errno == ENOENT) return 0; // 不存在视作成功
|
||
return errno;
|
||
}
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
void UnsetDataIpc(const paddle::Tensor& tmp_input,
|
||
const std::string& shm_name,
|
||
bool close_ipc,
|
||
bool unlink_shm) {
|
||
// 1) 关闭消费者导入的 IPC 映射(仅当 close_ipc=true 且该指针确为 OpenMemHandle 得来)
|
||
if (close_ipc) {
|
||
void* ptr = const_cast<void*>(tmp_input.data());
|
||
checkCudaErrors(cudaIpcCloseMemHandle(ptr));
|
||
}
|
||
|
||
// 2) 解除共享内存命名对象(仅处理“名字”,不保证解除旧映射)
|
||
if (unlink_shm) {
|
||
int rc = sharedMemoryUnlinkByName(shm_name.c_str());
|
||
if (rc != 0) {
|
||
PD_THROW("Unlink shared memory failed: name=%s, err=%d",
|
||
shm_name.c_str(), rc);
|
||
}
|
||
}
|
||
}
|
||
|
||
PD_BUILD_STATIC_OP(unset_data_ipc)
|
||
.Inputs({"tmp_input"})
|
||
.Attrs({"shm_name: std::string", "close_ipc: bool", "unlink_shm: bool"})
|
||
.SetKernelFn(PD_KERNEL(UnsetDataIpc));
|