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:
@@ -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*/
|
||||
|
||||
Yeni konuda referans
Bir kullanıcı engelle