mirror of
https://github.com/matrix-construct/construct
synced 2024-09-29 12:18:54 +02:00
ircd::gpt::pipe: Split pipe::code into separate unit.
This commit is contained in:
parent
f5fb03b1b5
commit
400b306833
2 changed files with 319 additions and 214 deletions
215
ircd/gpt_pipe.cc
215
ircd/gpt_pipe.cc
|
@ -1308,218 +1308,5 @@ ircd::gpt::pipe::model::matrix::matrix(cl::data *const master,
|
|||
},
|
||||
}
|
||||
{
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// pipe::code
|
||||
//
|
||||
|
||||
decltype(ircd::gpt::pipe::code::default_path)
|
||||
ircd::gpt::pipe::code::default_path
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.path" },
|
||||
};
|
||||
|
||||
decltype(ircd::gpt::pipe::code::cache_path)
|
||||
ircd::gpt::pipe::code::cache_path
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.cache.path" },
|
||||
};
|
||||
|
||||
decltype(ircd::gpt::pipe::code::default_opts)
|
||||
ircd::gpt::pipe::code::default_opts
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.opts" },
|
||||
{ "default", string_view
|
||||
{
|
||||
" -cl-strict-aliasing"
|
||||
" -cl-no-signed-zeros"
|
||||
" -cl-finite-math-only"
|
||||
" -cl-unsafe-math-optimizations"
|
||||
" -cl-fast-relaxed-math"
|
||||
" -cl-mad-enable"
|
||||
" -cl-single-precision-constant"
|
||||
//" -cl-fp32-correctly-rounded-divide-sqrt"
|
||||
|
||||
" -cl-kernel-arg-info"
|
||||
|
||||
" -O3"
|
||||
}}
|
||||
};
|
||||
|
||||
ircd::gpt::pipe::code::code()
|
||||
:cl::code{[]
|
||||
{
|
||||
const auto opts
|
||||
{
|
||||
fmt::snstringf
|
||||
{
|
||||
4096, "%s -I%s",
|
||||
string_view{default_opts},
|
||||
string_view{fs::base::include},
|
||||
}
|
||||
};
|
||||
|
||||
const auto cache_path
|
||||
{
|
||||
make_cache_path(fs::path_scratch)
|
||||
};
|
||||
|
||||
if(cache_path)
|
||||
if(fs::is_reg(cache_path))
|
||||
return from_cache(opts, cache_path);
|
||||
|
||||
return from_source(opts);
|
||||
}()}
|
||||
{
|
||||
put_cache();
|
||||
}
|
||||
|
||||
ircd::gpt::pipe::code::~code()
|
||||
noexcept
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::gpt::pipe::code::put_cache()
|
||||
{
|
||||
const auto cache_path
|
||||
{
|
||||
make_cache_path(fs::path_scratch)
|
||||
};
|
||||
|
||||
if(!cache_path)
|
||||
return false;
|
||||
|
||||
if(fs::is_reg(cache_path))
|
||||
return false;
|
||||
|
||||
set_cache(cache_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
ircd::gpt::pipe::code::set_cache(const string_view &path)
|
||||
{
|
||||
const unique_mutable_buffer cache_buf
|
||||
{
|
||||
this->bins_size()
|
||||
};
|
||||
|
||||
mutable_buffer _cache_bufs[1]
|
||||
{
|
||||
cache_buf
|
||||
};
|
||||
|
||||
const auto cache_bufs
|
||||
{
|
||||
this->bin(_cache_bufs)
|
||||
};
|
||||
|
||||
const fs::fd fd
|
||||
{
|
||||
path, std::ios::out
|
||||
};
|
||||
|
||||
const auto written
|
||||
{
|
||||
fs::write(fd, cache_bufs[0])
|
||||
};
|
||||
|
||||
assert(!empty(written));
|
||||
}
|
||||
|
||||
ircd::cl::code
|
||||
ircd::gpt::pipe::code::from_source(const string_view &opts)
|
||||
{
|
||||
const string_view code_path
|
||||
{
|
||||
default_path
|
||||
};
|
||||
|
||||
const fs::fd fd
|
||||
{
|
||||
code_path
|
||||
};
|
||||
|
||||
const std::string read
|
||||
{
|
||||
fs::read(fd)
|
||||
};
|
||||
|
||||
const string_view src
|
||||
{
|
||||
read
|
||||
};
|
||||
|
||||
const vector_view<const string_view> srcs
|
||||
(
|
||||
&src, 1
|
||||
);
|
||||
|
||||
return cl::code
|
||||
{
|
||||
srcs, opts
|
||||
};
|
||||
}
|
||||
|
||||
ircd::cl::code
|
||||
ircd::gpt::pipe::code::from_cache(const string_view &opts,
|
||||
const string_view &cache_path)
|
||||
{
|
||||
const fs::fd fd
|
||||
{
|
||||
cache_path
|
||||
};
|
||||
|
||||
const std::string read
|
||||
{
|
||||
fs::read(fd)
|
||||
};
|
||||
|
||||
const const_buffer bin
|
||||
{
|
||||
read
|
||||
};
|
||||
|
||||
const vector_view<const const_buffer> bins
|
||||
(
|
||||
&bin, 1
|
||||
);
|
||||
|
||||
return cl::code
|
||||
{
|
||||
bins, opts
|
||||
};
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::gpt::pipe::code::make_cache_path(const mutable_buffer &buf)
|
||||
{
|
||||
if(!cache_path)
|
||||
return {};
|
||||
|
||||
const string_view &src_path
|
||||
{
|
||||
default_path
|
||||
};
|
||||
|
||||
const string_view &src_fname
|
||||
{
|
||||
fs::filename(fs::path_scratch, src_path)
|
||||
};
|
||||
|
||||
const string_view &cache_fname
|
||||
{
|
||||
fs::extension(fs::name_scratch, src_fname, ".nir")
|
||||
};
|
||||
|
||||
const string_view parts[]
|
||||
{
|
||||
string_view{cache_path},
|
||||
string_view{cache_fname}
|
||||
};
|
||||
|
||||
return fs::path(buf, fs::path_views{parts});
|
||||
assert(aligned(offset, 4096));
|
||||
}
|
||||
|
|
318
ircd/gpt_pipe_code.cc
Normal file
318
ircd/gpt_pipe_code.cc
Normal file
|
@ -0,0 +1,318 @@
|
|||
// Tensor Construct
|
||||
//
|
||||
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||
// Copyright (C) 2016-2022 Jason Volk <jason@zemos.net>
|
||||
//
|
||||
// Permission to use, copy, modify, and/or distribute this software for any
|
||||
// purpose with or without fee is hereby granted, provided that the above
|
||||
// copyright notice and this permission notice is present in all copies. The
|
||||
// full license for this software is available in the LICENSE file.
|
||||
|
||||
decltype(ircd::gpt::pipe::code::default_path)
|
||||
ircd::gpt::pipe::code::default_path
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.path" },
|
||||
};
|
||||
|
||||
decltype(ircd::gpt::pipe::code::cache_path)
|
||||
ircd::gpt::pipe::code::cache_path
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.cache.path" },
|
||||
};
|
||||
|
||||
decltype(ircd::gpt::pipe::code::default_compile_opts)
|
||||
ircd::gpt::pipe::code::default_compile_opts
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.opts.comp" },
|
||||
{ "default", string_view
|
||||
{
|
||||
" -fident"
|
||||
" -fno-builtin"
|
||||
" -ffast-math"
|
||||
" -O3"
|
||||
|
||||
" -cl-no-signed-zeros"
|
||||
" -cl-finite-math-only"
|
||||
" -cl-fp32-correctly-rounded-divide-sqrt"
|
||||
" -cl-single-precision-constant"
|
||||
|
||||
" -cl-kernel-arg-info"
|
||||
}}
|
||||
};
|
||||
|
||||
decltype(ircd::gpt::pipe::code::default_link_opts)
|
||||
ircd::gpt::pipe::code::default_link_opts
|
||||
{
|
||||
{ "name", "ircd.gpt.pipe.code.opts.link" },
|
||||
{ "default", string_view
|
||||
{
|
||||
" -fident"
|
||||
" -fno-builtin"
|
||||
" -ffast-math"
|
||||
" -O3"
|
||||
|
||||
" -cl-no-signed-zeros"
|
||||
" -cl-finite-math-only"
|
||||
" -cl-fp32-correctly-rounded-divide-sqrt"
|
||||
" -cl-single-precision-constant"
|
||||
}}
|
||||
};
|
||||
|
||||
//
|
||||
// code::code
|
||||
//
|
||||
|
||||
ircd::gpt::pipe::code::code()
|
||||
:cl::code{[]() -> cl::code
|
||||
{
|
||||
const auto comp_opts
|
||||
{
|
||||
fmt::snstringf
|
||||
{
|
||||
4096, "%s -I%s",
|
||||
string_view{default_compile_opts},
|
||||
string_view{fs::base::include},
|
||||
}
|
||||
};
|
||||
|
||||
const string_view link_opts
|
||||
{
|
||||
default_link_opts
|
||||
};
|
||||
|
||||
cl::code ret;
|
||||
|
||||
if(!ret)
|
||||
ret = from_cache();
|
||||
|
||||
if(!ret)
|
||||
ret = from_bitcode(link_opts);
|
||||
|
||||
if(!ret)
|
||||
ret = from_source(comp_opts, link_opts);
|
||||
|
||||
return ret;
|
||||
}()}
|
||||
{
|
||||
put_cache();
|
||||
}
|
||||
|
||||
ircd::gpt::pipe::code::~code()
|
||||
noexcept
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::gpt::pipe::code::put_cache()
|
||||
{
|
||||
const auto cache_path
|
||||
{
|
||||
make_cache_path(fs::path_scratch)
|
||||
};
|
||||
|
||||
if(!cache_path)
|
||||
return false;
|
||||
|
||||
if(fs::is_reg(cache_path))
|
||||
return false;
|
||||
|
||||
set_cache(cache_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
ircd::gpt::pipe::code::set_cache(const string_view &path)
|
||||
{
|
||||
const unique_mutable_buffer cache_buf
|
||||
{
|
||||
this->bins_size()
|
||||
};
|
||||
|
||||
mutable_buffer _cache_bufs[1]
|
||||
{
|
||||
cache_buf
|
||||
};
|
||||
|
||||
const auto cache_bufs
|
||||
{
|
||||
this->bin(_cache_bufs)
|
||||
};
|
||||
|
||||
const fs::fd fd
|
||||
{
|
||||
path, std::ios::out
|
||||
};
|
||||
|
||||
const auto written
|
||||
{
|
||||
fs::write(fd, cache_bufs[0])
|
||||
};
|
||||
|
||||
assert(!empty(written));
|
||||
}
|
||||
|
||||
extern const uint8_t
|
||||
gpt_gpu_r600_barts_bc[];
|
||||
|
||||
extern const uint
|
||||
gpt_gpu_r600_barts_bc_len;
|
||||
|
||||
ircd::cl::code
|
||||
ircd::gpt::pipe::code::from_bitcode(const string_view &link_opts)
|
||||
{
|
||||
const const_buffer bitcode
|
||||
{
|
||||
reinterpret_cast<const char *>(gpt_gpu_r600_barts_bc),
|
||||
gpt_gpu_r600_barts_bc_len
|
||||
};
|
||||
|
||||
char pbuf[1][48];
|
||||
log::debug
|
||||
{
|
||||
log, "bitcode %p %s link_opts:%zu attempting...",
|
||||
data(bitcode),
|
||||
pretty(pbuf[0], si(size(bitcode))),
|
||||
size(link_opts),
|
||||
};
|
||||
|
||||
cl::code ret
|
||||
{
|
||||
bitcode
|
||||
};
|
||||
|
||||
ret.link(link_opts);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ircd::cl::code
|
||||
ircd::gpt::pipe::code::from_source(const string_view &comp_opts,
|
||||
const string_view &link_opts)
|
||||
{
|
||||
const string_view code_path
|
||||
{
|
||||
default_path
|
||||
};
|
||||
|
||||
if(!code_path)
|
||||
return {};
|
||||
|
||||
if(!fs::is_reg(code_path))
|
||||
return {};
|
||||
|
||||
const fs::fd fd
|
||||
{
|
||||
code_path
|
||||
};
|
||||
|
||||
const std::string read
|
||||
{
|
||||
fs::read(fd)
|
||||
};
|
||||
|
||||
const string_view src
|
||||
{
|
||||
read
|
||||
};
|
||||
|
||||
const vector_view<const string_view> srcs
|
||||
(
|
||||
&src, 1
|
||||
);
|
||||
|
||||
char pbuf[1][48];
|
||||
log::debug
|
||||
{
|
||||
log, "source code `%s' %s comp_opts:%zu link_opts:%zu attempting...",
|
||||
code_path,
|
||||
pretty(pbuf[0], si(size(read))),
|
||||
size(comp_opts),
|
||||
size(link_opts),
|
||||
};
|
||||
|
||||
cl::code ret
|
||||
{
|
||||
srcs
|
||||
};
|
||||
|
||||
ret.compile(comp_opts);
|
||||
ret.link(link_opts);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ircd::cl::code
|
||||
ircd::gpt::pipe::code::from_cache()
|
||||
{
|
||||
const auto cache_path
|
||||
{
|
||||
make_cache_path(fs::path_scratch)
|
||||
};
|
||||
|
||||
if(!cache_path)
|
||||
return {};
|
||||
|
||||
if(!fs::is_reg(cache_path))
|
||||
return {};
|
||||
|
||||
const fs::fd fd
|
||||
{
|
||||
cache_path
|
||||
};
|
||||
|
||||
const std::string read
|
||||
{
|
||||
fs::read(fd)
|
||||
};
|
||||
|
||||
const const_buffer bin
|
||||
{
|
||||
read
|
||||
};
|
||||
|
||||
const vector_view<const const_buffer> bins
|
||||
(
|
||||
&bin, 1
|
||||
);
|
||||
|
||||
char pbuf[1][48];
|
||||
log::debug
|
||||
{
|
||||
log, "cached nir `%s' %s attempting...",
|
||||
cache_path,
|
||||
pretty(pbuf[0], si(size(read))),
|
||||
};
|
||||
|
||||
return cl::code
|
||||
{
|
||||
bins
|
||||
};
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::gpt::pipe::code::make_cache_path(const mutable_buffer &buf)
|
||||
{
|
||||
if(!cache_path)
|
||||
return {};
|
||||
|
||||
const string_view &src_path
|
||||
{
|
||||
default_path
|
||||
};
|
||||
|
||||
const string_view &src_fname
|
||||
{
|
||||
fs::filename(fs::path_scratch, src_path)
|
||||
};
|
||||
|
||||
const string_view &cache_fname
|
||||
{
|
||||
fs::extension(fs::name_scratch, src_fname, ".r600_barts.bc")
|
||||
};
|
||||
|
||||
const string_view parts[]
|
||||
{
|
||||
string_view{cache_path},
|
||||
string_view{cache_fname}
|
||||
};
|
||||
|
||||
return fs::path(buf, fs::path_views{parts});
|
||||
}
|
Loading…
Reference in a new issue