SWDEV-282397 - Alloc scratch memory on the current queue
Device enqueue has an option to execute scheduler on the current
queue and it's enabled by default. Make sure scratch is allocated
on the current queue for that case. Add max vgpr tracking per
program to adjust scratch size accordingly.
Change-Id: I2a6d796913a4551a1e7f343a2465d589eec60d8a
[ROCm/clr commit: e553b2763a]
このコミットが含まれているのは:
@@ -2043,19 +2043,24 @@ bool Device::validateKernel(const amd::Kernel& kernel, const device::VirtualDevi
|
||||
}
|
||||
}
|
||||
|
||||
if (devKernel->hsa()) {
|
||||
const HSAILKernel* hsaKernel = static_cast<const HSAILKernel*>(devKernel);
|
||||
if (hsaKernel->dynamicParallelism()) {
|
||||
const HSAILKernel* hsaKernel = static_cast<const HSAILKernel*>(devKernel);
|
||||
if (hsaKernel->dynamicParallelism()) {
|
||||
if (settings().useDeviceQueue_) {
|
||||
amd::DeviceQueue* defQueue = kernel.program().context().defDeviceQueue(*this);
|
||||
if (defQueue != nullptr) {
|
||||
vgpu = static_cast<VirtualGPU*>(defQueue->vDev());
|
||||
if (!allocScratch(hsaKernel->prog().maxScratchRegs(), vgpu,
|
||||
devKernel->workGroupInfo()->usedVGPRs_)) {
|
||||
hsaKernel->prog().maxVgprs())) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!allocScratch(hsaKernel->prog().maxScratchRegs(), vgpu,
|
||||
hsaKernel->prog().maxVgprs())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -181,6 +181,7 @@ HSAILProgram::HSAILProgram(Device& device, amd::Program& owner)
|
||||
codeSegGpu_(nullptr),
|
||||
codeSegment_(nullptr),
|
||||
maxScratchRegs_(0),
|
||||
maxVgprs_(0),
|
||||
executable_(nullptr),
|
||||
loaderContext_(this) {
|
||||
assert(device.isOnline());
|
||||
@@ -194,6 +195,7 @@ HSAILProgram::HSAILProgram(NullDevice& device, amd::Program& owner)
|
||||
codeSegGpu_(nullptr),
|
||||
codeSegment_(nullptr),
|
||||
maxScratchRegs_(0),
|
||||
maxVgprs_(0),
|
||||
executable_(nullptr),
|
||||
loaderContext_(this) {
|
||||
assert(!device.isOnline());
|
||||
@@ -317,6 +319,7 @@ bool HSAILProgram::setKernels(amd::option::Options* options, void* binary, size_
|
||||
// with dynamic parallelism, since runtime doesn't know which child kernel will be called
|
||||
maxScratchRegs_ =
|
||||
std::max(static_cast<uint>(aKernel->workGroupInfo()->scratchRegs_), maxScratchRegs_);
|
||||
maxVgprs_ = std::max(static_cast<uint>(aKernel->workGroupInfo()->usedVGPRs_), maxVgprs_);
|
||||
}
|
||||
// Allocate kernel table for device enqueuing
|
||||
if (!isNull() && dynamicParallelism && !allocKernelTable()) {
|
||||
@@ -781,6 +784,7 @@ bool LightningProgram::setKernels(amd::option::Options* options, void* binary, s
|
||||
// with dynamic parallelism, since runtime doesn't know which child kernel will be called
|
||||
maxScratchRegs_ =
|
||||
std::max(static_cast<uint>(kernel->workGroupInfo()->scratchRegs_), maxScratchRegs_);
|
||||
maxVgprs_ = std::max(static_cast<uint>(kernel->workGroupInfo()->usedVGPRs_), maxVgprs_);
|
||||
}
|
||||
DestroySegmentCpuAccess();
|
||||
#endif // defined(USE_COMGR_LIBRARY)
|
||||
|
||||
@@ -177,6 +177,9 @@ class HSAILProgram : public device::Program {
|
||||
//! Returns the maximum number of scratch regs used in the program
|
||||
uint maxScratchRegs() const { return maxScratchRegs_; }
|
||||
|
||||
//! Returns the maximum number of VGPR(s) used in the program
|
||||
uint maxVgprs() const { return maxVgprs_; }
|
||||
|
||||
//! Add internal static sampler
|
||||
void addSampler(Sampler* sampler) { staticSamplers_.push_back(sampler); }
|
||||
|
||||
@@ -237,8 +240,11 @@ class HSAILProgram : public device::Program {
|
||||
Memory* kernels_; //!< Table with kernel object pointers
|
||||
Memory* codeSegGpu_; //!< GPU memory with code objects
|
||||
Segment* codeSegment_; //!< Pointer to the code segment for this program
|
||||
uint
|
||||
maxScratchRegs_; //!< Maximum number of scratch regs used in the program by individual kernel
|
||||
uint maxScratchRegs_; //!< Maximum number of scratch regs used
|
||||
//!< in the program by individual kernel
|
||||
uint maxVgprs_; //!< Maximum number of VGPR(s) used
|
||||
//!< in the program by individual kernel
|
||||
|
||||
std::list<Sampler*> staticSamplers_; //!< List od internal static samplers
|
||||
|
||||
amd::hsa::loader::Loader* loader_; //!< Loader object
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする