SWDEV-284895 - Adding kind metadata and launch init/fini marked kernels

Change-Id: If2b21c4b98567632c426943e0b69aca8d6f1ec2a


[ROCm/clr commit: 102aa9d6d9]
Bu işleme şunda yer alıyor:
anusha GodavarthySurya
2021-12-01 08:17:44 -08:00
ebeveyn 0ef7ea3ad9
işleme 02e46ec231
6 değiştirilmiş dosya ile 123 ekleme ve 3 silme
+71
Dosyayı Görüntüle
@@ -18,6 +18,8 @@
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. */
#include "platform/command.hpp"
#include "platform/commandqueue.hpp"
#include "platform/runtime.hpp"
#include "platform/program.hpp"
#include "platform/ndrange.hpp"
@@ -2952,4 +2954,73 @@ bool Program::getGlobalVarFromCodeObj(std::vector<std::string>* var_names) const
return true;
#endif
}
amd::Monitor Program::initFiniLock_("Init Fini Launch Lock", true);
bool Program::runInitFiniKernel(kernel_kind_t kind) const {
amd::HostQueue* queue = nullptr;
for (const auto& i : kernels_) {
LogPrintfInfo("For Init/Fini: Kernel Name: %s", i.first.c_str());
const auto &kernel = i.second;
if ((kernel->isInitKernel() && kind == kernel_kind_t::InitKernel) ||
(kernel->isFiniKernel() && kind == kernel_kind_t::FiniKernel)) {
amd::ScopedLock sl(initFiniLock_);
if (queue == nullptr) {
queue = new amd::HostQueue(device_().context(), device_(), 0);
if (queue == nullptr) {
LogError("Unable to create queue");
return false;
}
queue->create();
}
LogPrintfInfo("%s is marked init/fini", i.first.c_str());
size_t globalWorkOffset[3] = {0};
size_t globalWorkSize[3] = {1, 1, 1};
size_t localWorkSize[3] = {1, 1, 1};
amd::NDRangeContainer ndrange(3, globalWorkOffset, globalWorkSize, localWorkSize);
amd::Command::EventWaitList waitList;
auto symbol = owner_.findSymbol(kernel->name().c_str());
amd::Kernel* k = new amd::Kernel(owner_, *symbol, kernel->name().c_str());
if (!k) {
queue->release();
LogError("Unable to create kernel");
return false;
}
amd::NDRangeKernelCommand* kernelCommand =
new amd::NDRangeKernelCommand(*queue, waitList, *k, ndrange);
if (!kernelCommand) {
LogError("Unale to allocate memory to launch kernel");
k->release();
queue->release();
return false;
}
if (CL_SUCCESS != kernelCommand->captureAndValidate()) {
LogError("Kernel Capture and Validate failed");
kernelCommand->release();
k->release();
queue->release();
return false;
}
kernelCommand->enqueue();
queue->finish();
k->release();
kernelCommand->release();
}
}
if (queue != nullptr) {
queue->release();
}
return true;
}
bool Program::runInitKernels() { return runInitFiniKernel(kernel_kind_t::InitKernel); }
bool Program::runFiniKernels() { return runInitFiniKernel(kernel_kind_t::FiniKernel); }
} /* namespace device*/