| 2149 | amd::Monitor Program::initFiniLock_(true); |
| 2150 | |
| 2151 | bool Program::runInitFiniKernel(const std::vector<const Kernel*>& kernels) const { |
| 2152 | amd::HostQueue* queue = nullptr; |
| 2153 | |
| 2154 | for (const auto& kernel : kernels) { |
| 2155 | amd::ScopedLock sl(initFiniLock_); |
| 2156 | |
| 2157 | if (queue == nullptr) { |
| 2158 | queue = new amd::HostQueue(device_().context(), device_(), 0); |
| 2159 | if (queue == nullptr) { |
| 2160 | LogError("Unable to create queue"); |
| 2161 | return false; |
| 2162 | } |
| 2163 | queue->create(); |
| 2164 | } |
| 2165 | |
| 2166 | LogPrintfInfo("%s is marked init/fini", kernel->name().c_str()); |
| 2167 | |
| 2168 | size_t globalWorkOffset[3] = {0}; |
| 2169 | size_t globalWorkSize[3] = {1, 1, 1}; |
| 2170 | size_t localWorkSize[3] = {1, 1, 1}; |
| 2171 | amd::NDRangeContainer ndrange(3, globalWorkOffset, globalWorkSize, localWorkSize); |
| 2172 | amd::Command::EventWaitList waitList; |
| 2173 | |
| 2174 | auto symbol = owner_.findSymbol(kernel->name().c_str()); |
| 2175 | amd::Kernel* k = new amd::Kernel(owner_, *symbol, kernel->name().c_str()); |
| 2176 | if (!k) { |
| 2177 | queue->release(); |
| 2178 | LogError("Unable to create kernel"); |
| 2179 | return false; |
| 2180 | } |
| 2181 | |
| 2182 | amd::NDRangeKernelCommand* kernelCommand = |
| 2183 | new amd::NDRangeKernelCommand(*queue, waitList, *k, ndrange); |
| 2184 | if (!kernelCommand) { |
| 2185 | LogError("Unale to allocate memory to launch kernel"); |
| 2186 | k->release(); |
| 2187 | queue->release(); |
| 2188 | return false; |
| 2189 | } |
| 2190 | if (CL_SUCCESS != kernelCommand->captureAndValidate()) { |
| 2191 | LogError("Kernel Capture and Validate failed"); |
| 2192 | kernelCommand->release(); |
| 2193 | k->release(); |
| 2194 | queue->release(); |
| 2195 | return false; |
| 2196 | } |
| 2197 | kernelCommand->enqueue(); |
| 2198 | queue->finish(); |
| 2199 | k->release(); |
| 2200 | kernelCommand->release(); |
| 2201 | } |
| 2202 | |
| 2203 | if (queue != nullptr) { |
| 2204 | queue->release(); |
| 2205 | } |
| 2206 | return true; |
| 2207 | } |
| 2208 |
nothing calls this directly
no test coverage detected