开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
main
分支 (1093)
标签 (17)
main
xtensa-codegen
vksnk/dma-limit-channels
rootjalex/trs-codegen-cross
abadams/fix_7374
abadams/remove_hack_from_gpu_only_aottest
srj/gpu-cache
srj/generator_aot_gpu_multi_context_threaded
srj/xtensa-merge
abadams/vector_scan
abadams/fix_7365
darya-ver/ir-viz
vulkan-phase2-runtime
srj/param-map-deprecation
srj/rt-return-types
srj/main-vs2022
release/15.x
srj/param-map
abadams/ir_builder_unique_ptr
vksnk/restrict
v14.0.0
v13.0.4
v13.0.3
v13.0.2
v13.0.1
v13.0.0
v12.0.1
v12.0.0
v11.0.1
v11.0.0
v10.0.1
v10.0.0
release_2019_08_27
release_8.0.0
v8.0.0
release_2018_02_15
release_2013_11_11
main
分支 (1093)
标签 (17)
main
xtensa-codegen
vksnk/dma-limit-channels
rootjalex/trs-codegen-cross
abadams/fix_7374
abadams/remove_hack_from_gpu_only_aottest
srj/gpu-cache
srj/generator_aot_gpu_multi_context_threaded
srj/xtensa-merge
abadams/vector_scan
abadams/fix_7365
darya-ver/ir-viz
vulkan-phase2-runtime
srj/param-map-deprecation
srj/rt-return-types
srj/main-vs2022
release/15.x
srj/param-map
abadams/ir_builder_unique_ptr
vksnk/restrict
v14.0.0
v13.0.4
v13.0.3
v13.0.2
v13.0.1
v13.0.0
v12.0.1
v12.0.0
v11.0.1
v11.0.0
v10.0.1
v10.0.0
release_2019_08_27
release_8.0.0
v8.0.0
release_2018_02_15
release_2013_11_11
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
main
分支 (1093)
标签 (17)
main
xtensa-codegen
vksnk/dma-limit-channels
rootjalex/trs-codegen-cross
abadams/fix_7374
abadams/remove_hack_from_gpu_only_aottest
srj/gpu-cache
srj/generator_aot_gpu_multi_context_threaded
srj/xtensa-merge
abadams/vector_scan
abadams/fix_7365
darya-ver/ir-viz
vulkan-phase2-runtime
srj/param-map-deprecation
srj/rt-return-types
srj/main-vs2022
release/15.x
srj/param-map
abadams/ir_builder_unique_ptr
vksnk/restrict
v14.0.0
v13.0.4
v13.0.3
v13.0.2
v13.0.1
v13.0.0
v12.0.1
v12.0.0
v11.0.1
v11.0.0
v10.0.1
v10.0.0
release_2019_08_27
release_8.0.0
v8.0.0
release_2018_02_15
release_2013_11_11
Halide
/
src
/
CodeGen_PyTorch.cpp
Halide
/
src
/
CodeGen_PyTorch.cpp
CodeGen_PyTorch.cpp 7.18 KB
一键复制 编辑 原始数据 按行查看 历史
#include <iostream>
#include "CodeGen_C.h"
#include "CodeGen_PyTorch.h"
#include "IROperator.h"
#include "Module.h"
#include "Param.h"
#include "Util.h"
#include "Var.h"
namespace Halide {
namespace Internal {
CodeGen_PyTorch::CodeGen_PyTorch(std::ostream &s)
: IRPrinter(s) {
}
void CodeGen_PyTorch::compile(const Module &module) {
const Target target = module.target();
if (target.has_feature(Target::CUDA)) {
if (!target.has_feature(Target::UserContext)) {
user_error << "Compile a PyTorch wrapper for a CUDA op requires the "
"UserContext feature to properly manage the GPU memory. "
"Please add \"-user_context\" to the generator's target options.\n";
}
stream << "#include \"ATen/cuda/CUDAContext.h\"\n";
}
stream << "#include \"HalideBuffer.h\"\n";
stream << "#include \"HalidePyTorchHelpers.h\"\n";
stream << "\n";
// Emit extern decls of the Halide-generated functions we use directly
// into this file, so that we don't have to #include the relevant .h
// file directly; this simplifies certain compile/build setups (since
// we don't have to build files in tandem and/or get include paths right),
// and should be totally safe, since we are using the same codegen logic
// that would be in the .h file anyway.
{
CodeGen_C extern_decl_gen(stream, module.target(), CodeGen_C::CPlusPlusExternDecl);
extern_decl_gen.compile(module);
}
for (const auto &f : module.functions()) {
if (target.has_feature(Target::CUDA)) {
compile(f, true);
} else {
compile(f, false);
}
}
}
void CodeGen_PyTorch::compile(const LoweredFunc &f, bool is_cuda) {
// Don't put non-external function declarations in headers.
std::vector<std::string> namespaces;
std::string simple_name = extract_namespaces(f.name, namespaces);
if (!namespaces.empty()) {
for (const auto &ns : namespaces) {
stream << "namespace " << ns << " {\n";
}
stream << "\n";
}
const std::vector<LoweredArgument> &args = f.args;
std::vector<LoweredArgument> buffer_args;
stream << "HALIDE_FUNCTION_ATTRS\n";
stream << "inline int " << simple_name << "_th_(";
for (size_t i = 0; i < args.size(); i++) {
if (args[i].name == "__user_context") {
continue;
} else if (args[i].is_buffer()) {
buffer_args.push_back(args[i]);
stream
<< "at::Tensor &"
<< c_print_name(args[i].name);
} else {
stream
<< type_to_c_type(args[i].type, true)
<< c_print_name(args[i].name);
}
if (i < args.size() - 1) {
stream << ", ";
}
}
stream << ") {\n";
indent += 4;
if (is_cuda) {
stream << get_indent() << "// Setup CUDA\n";
stream << get_indent() << "int device_id = at::cuda::current_device();\n";
stream << get_indent() << "CUcontext ctx = 0;\n";
stream << get_indent() << "CUresult res = cuCtxGetCurrent(&ctx);\n";
stream << get_indent() << "AT_ASSERTM(res == 0, \"Could not acquire CUDA context\");\n";
stream << get_indent() << "cudaStream_t stream = at::cuda::getCurrentCUDAStream(device_id);\n";
stream << get_indent() << "struct UserContext { int device_id; CUcontext *cuda_context; cudaStream_t *stream; } user_ctx;\n";
stream << get_indent() << "user_ctx.device_id = device_id;\n";
stream << get_indent() << "user_ctx.cuda_context = &ctx;\n";
stream << get_indent() << "user_ctx.stream = &stream;\n";
stream << get_indent() << "void* __user_context = (void*) &user_ctx;\n\n";
} else {
stream << get_indent() << "void* __user_context = nullptr;\n\n";
}
stream << get_indent() << "// Check tensors have contiguous memory and are on the correct device\n";
for (auto &buffer_arg : buffer_args) {
stream << get_indent();
stream
<< "HLPT_CHECK_CONTIGUOUS("
<< c_print_name(buffer_arg.name)
<< ");\n";
if (is_cuda) {
stream << get_indent();
stream
<< "HLPT_CHECK_DEVICE("
<< c_print_name(buffer_arg.name)
<< ", device_id);\n";
}
}
stream << "\n";
stream << get_indent() << "// Wrap tensors in Halide buffers\n";
for (auto &buffer_arg : buffer_args) {
if (!buffer_arg.is_buffer()) {
continue;
}
stream << get_indent();
std::string tp = type_to_c_type(buffer_arg.type, false);
stream
<< "Halide::Runtime::Buffer<" << tp << "> "
<< c_print_name(buffer_arg.name);
if (is_cuda) {
stream
<< "_buffer = Halide::PyTorch::wrap_cuda<" << tp << ">(";
} else {
stream
<< "_buffer = Halide::PyTorch::wrap<" << tp << ">(";
}
stream
<< c_print_name(buffer_arg.name)
<< ");\n";
}
stream << "\n";
stream << get_indent() << "// Run Halide pipeline\n";
stream << get_indent() << "int err = " << simple_name << "(";
for (size_t i = 0; i < args.size(); i++) {
if (args[i].is_buffer()) {
stream
<< c_print_name(args[i].name)
<< "_buffer";
} else {
stream << c_print_name(args[i].name);
}
if (i < args.size() - 1) {
stream << ", ";
}
}
stream << ");\n";
stream << "\n";
stream << get_indent() << "AT_ASSERTM(err == 0, \"Halide call failed\");\n";
if (is_cuda) {
stream << get_indent() << "// Make sure data is on device\n";
for (auto &buffer_arg : buffer_args) {
if (buffer_arg.is_buffer()) {
stream << get_indent();
stream
<< "AT_ASSERTM(!"
<< c_print_name(buffer_arg.name) << "_buffer.host_dirty(),"
<< "\"device not synchronized for buffer "
<< c_print_name(buffer_arg.name)
<< ", make sure all update stages are explicitly computed on GPU."
<< "\");\n";
stream << get_indent();
stream
<< c_print_name(buffer_arg.name) << "_buffer"
<< ".device_detach_native();\n";
}
}
stream << "\n";
}
// TODO(mgharbi): this is not very well documented
if (get_env_variable("FLUSH_MEMOIZE_CACHE") == "1") {
stream << get_indent() << "// Flush cache\n";
if (is_cuda) {
stream << get_indent() << "halide_memoization_cache_cleanup(__user_context);\n";
} else {
stream << get_indent() << "halide_memoization_cache_cleanup(nullptr);\n";
}
}
stream << get_indent() << "return 0;\n";
indent -= 4;
stream << "}\n";
if (!namespaces.empty()) {
stream << "\n";
for (size_t i = namespaces.size(); i > 0; i--) {
stream << "} // namespace " << namespaces[i - 1] << "\n";
}
stream << "\n";
}
}
} // namespace Internal
} // namespace Halide
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

MIT计算机科学和人工智能实验室的研究人员创造出一种专门设计简化图像处理的程序语言Halide,源代码托管在GitHub上,目前二进制程序只支持Mac OS X和Ubuntu 12
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/VisionDeveloper/Halide.git
git@gitee.com:VisionDeveloper/Halide.git
VisionDeveloper
Halide
Halide
main
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /