void OpenCLScheduler::initialize(const int channels) {
    // multi-gpu?
    if (!cfg_gpus.empty()) {
        auto silent{false};
        for (auto gpu : cfg_gpus) {
            auto opencl = std::make_unique<OpenCL>();
            auto net = std::make_unique<OpenCL_Network>(*opencl);
            opencl->initialize(channels, {gpu}, silent);
            m_opencl.push_back(std::move(opencl));
            m_networks.push_back(std::move(net));

            // Clear thread data on every init call.  We don't know which GPU
            // this thread will be eventually be assigned to
            opencl_thread_data = ThreadData();

            // starting next GPU, let's not dump full list of GPUs
            silent = true;
        }

        for (size_t gnum = 0; gnum < m_networks.size(); gnum++) {
            // launch the worker thread.  2 threads so that we can fully
            // utilize GPU, since the worker thread consists of some CPU
            // work for task preparation.
            constexpr auto num_threads = 2;
            for (auto i = 0; i < num_threads; i++) {
                m_threadpool.add_thread([gnum] {
                    current_thread_gpu_num = gnum;
                });
            }
        }
    } else {
        auto opencl = std::make_unique<OpenCL>();
        auto net = std::make_unique<OpenCL_Network>(*opencl);
        opencl->initialize(channels, {});

        m_opencl.push_back(std::move(opencl));
        m_networks.push_back(std::move(net));
    }
}
Beispiel #2
0
ThreadData ThreadsHandler::thread(ThreadId id) const
{
    const int i = indexOf(id);
    return i == -1 ? ThreadData() : m_threads.at(i);
}
Beispiel #3
0
bool UpdateFromEvent(DEBUG_EVENT& evt, DumpData& data)
{
    switch(evt.dwDebugEventCode)
    {
    case CREATE_PROCESS_DEBUG_EVENT:
    {
        data.ProcessPath.resize(MAX_PATH);
        DWORD len = GetModuleFileNameExA(evt.u.CreateProcessInfo.hProcess, NULL, &data.ProcessPath[0], data.ProcessPath.size());
        if (len)
        {
            data.ProcessPath.resize(len);
            std::string::size_type pos = data.ProcessPath.find_last_of("\\/");
            if (pos != std::string::npos)
                data.ProcessName = data.ProcessPath.substr(pos+1);
        }
        else
        {
            data.ProcessPath = "??";
        }
        if (data.ProcessName.empty())
            data.ProcessName = data.ProcessPath;

        CloseHandle(evt.u.CreateProcessInfo.hFile);
        data.ProcessID = evt.dwProcessId;
        data.ProcessHandle = evt.u.CreateProcessInfo.hProcess;
        data.Threads[evt.dwThreadId] = ThreadData(evt.u.CreateProcessInfo.hThread);
    }
        break;
    case CREATE_THREAD_DEBUG_EVENT:
        data.Threads[evt.dwThreadId] = ThreadData(evt.u.CreateThread.hThread);
        break;
    case EXIT_THREAD_DEBUG_EVENT:
    {
        ThreadMap::iterator it = data.Threads.find(evt.dwThreadId);
        if (it != data.Threads.end())
        {
            data.Threads.erase(it);
        }
    }
        break;
    case LOAD_DLL_DEBUG_EVENT:
        CloseHandle(evt.u.LoadDll.hFile);
        for (size_t n = 0; n < data.Modules.size(); ++n)
        {
            if (data.Modules[n].BaseAddress == evt.u.LoadDll.lpBaseOfDll)
            {
                data.Modules[n].Unloaded = false;
                return true;
            }
        }
        data.Modules.push_back(ModuleData(evt.u.LoadDll.lpBaseOfDll));
        break;
    case UNLOAD_DLL_DEBUG_EVENT:
        for (size_t n = 0; n < data.Modules.size(); ++n)
        {
            if (data.Modules[n].BaseAddress == evt.u.UnloadDll.lpBaseOfDll)
                data.Modules[n].Unloaded = true;
        }
        break;
    case OUTPUT_DEBUG_STRING_EVENT: // ignore
        break;
    case EXCEPTION_DEBUG_EVENT:
        if (evt.u.Exception.dwFirstChance)
        {
            switch(evt.u.Exception.ExceptionRecord.ExceptionCode)
            {
            case EXCEPTION_BREAKPOINT:
                if (!data.FirstBPHit)
                {
                    data.FirstBPHit = true;

                    if (data.Event)
                    {
                        SetEvent(data.Event);
                        CloseHandle(data.Event);
                        data.Event = NULL;
                    }
                    return true;
                }
                break;
            case MS_VC_EXCEPTION_THREAD_NAME:
                /* Thread name */
                return true;
            case DBG_CONTROL_C:
            case DBG_CONTROL_BREAK:
                return true;
            }
        }
        data.ExceptionInfo = evt.u.Exception;
        data.ThreadID = evt.dwThreadId;
        return false;
    case EXIT_PROCESS_DEBUG_EVENT:
        //assert(FALSE);
        return false;
    case RIP_EVENT:
        //assert(FALSE);
        return false;
    default:
        assert(false);
    }
    return true;
}
 virtual ScheduleThreadData * createThreadData ()
 {
    return NEW ThreadData();
 }