如何在C++中连接使用多线程进程std::thread创建的LibTorch张量



C++中的多线程进程返回张量,我想按顺序将它们连接到一个张量中。

在C++中,我有一个函数,它返回一个1x8张量
我用std::thread同时多次调用此函数,并希望将它返回的张量连接到一个大张量中。例如,我称它为12次,我希望它完成时有一个12x8张量。

我需要把它们按顺序连接起来,也就是说,用0调用的张量应该总是在第0个位置,然后是在第1个位置的第1个,依此类推

我知道我可以让函数返回一个12x8张量,但我需要解决如何获取多线程过程中产生的张量的问题。

在下面的尝试中,我试图将张量连接到all_episode_steps张量中,但这会返回一个错误
如果您注释掉all_episode_steps行,并将std::cout << one;放在返回语句上方的get_tensors函数中,您会发现它似乎正在使用多线程创建张量,而没有任何问题。

#include <torch/torch.h>
torch::Tensor get_tensors(int id) {
torch::Tensor one = torch::rand({8});
return one.unsqueeze(0);
}
torch::Tensor all_episode_steps;
int main() {
std::thread ths[100];
for (int id=0; id<12; id++) {
ths[id] = std::thread(get_tensors, id);
all_episode_steps = torch::cat({ths[id], all_episode_steps});
}
for (int id=0; id<12; id++) {
ths[id].join();
}
}

如果你想自己构建这个,你可以在这里安装LibTorch
下面是上面代码的CMakeLists.txt文件。

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
# The following code block is suggested to be used on Windows.
# According to https://github.com/pytorch/pytorch/issues/25457,
# the DLLs need to be copied to avoid memory errors.
if (MSVC)
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
add_custom_command(TARGET example-app
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${TORCH_DLLS}
$<TARGET_FILE_DIR:example-app>)
endif (MSVC)

线程不能返回张量,但可以通过指针修改张量。试试这个(未经测试,可能需要一些调整(:

void get_tensors(torch::Tensor* out) {
torch::Tensor one = torch::rand({8});
*out = one.unsqueeze(0);
}
int main() {
std::thread ths[12];
std::vector<torch::Tensor> results(12);
for (int id=0; id<12; id++) {
ths[id] = std::thread(get_tensors, &results[id]);
}
for (int id=0; id<12; id++) {
ths[id].join();
}
auto result2d = torch::cat(results);
}

相关内容

  • 没有找到相关文章