#include "cudpp.h"
#include "cudpp_plan.h"
#include "cudpp_plan_manager.h"
#include "cudpp_maximal_launch.h"
typedef void* KernelPointer;
extern "C" size_t getNumCTAs(KernelPointer kernel)
{
return CUDPPPlanManager::numCTAs(kernel);
}
extern "C" void compNumCTAs(KernelPointer kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock)
{
CUDPPPlanManager::computeNumCTAs(kernel, bytesDynamicSharedMem, threadsPerBlock);
}
void CUDPPPlanManager::Instantiate()
{
if (NULL == m_instance)
m_instance = new CUDPPPlanManager;
}
void CUDPPPlanManager::Destroy()
{
if (NULL != m_instance)
{
delete m_instance;
m_instance = NULL;
}
}
CUDPPPlanManager::~CUDPPPlanManager()
{
std::map<CUDPPHandle,CUDPPPlan*>::iterator it;
for (it = m_instance->plans.begin(); it != m_instance->plans.end(); it++)
{
CUDPPPlan* plan = it->second;
delete plan;
plan = NULL;
}
m_instance->plans.clear();
m_instance->numCTAsTable.clear();
}
CUDPPHandle CUDPPPlanManager::AddPlan(CUDPPPlan* plan)
{
Instantiate();
std::pair<std::map<CUDPPHandle, CUDPPPlan*>::iterator, bool> ret;
CUDPPHandle handle = (CUDPPHandle)m_instance->plans.size();
ret = m_instance->plans.insert(std::pair<CUDPPHandle,CUDPPPlan*>(handle, plan));
if (ret.second == true)
return handle;
else
return CUDPP_INVALID_HANDLE;
}
bool CUDPPPlanManager::RemovePlan(CUDPPHandle handle)
{
if (m_instance == NULL)
{
return false;
}
std::map<CUDPPHandle,CUDPPPlan*>::iterator it;
it = m_instance->plans.find(handle);
if (it != m_instance->plans.end())
{
CUDPPPlan* plan = it->second;
delete plan;
plan = NULL;
m_instance->plans.erase(it);
if (0 == m_instance->plans.size())
{
Destroy();
}
return true;
}
else
{
return false;
}
}
CUDPPPlan* CUDPPPlanManager::GetPlan(CUDPPHandle handle)
{
if (m_instance == NULL)
{
return NULL;
}
std::map<CUDPPHandle, CUDPPPlan*>::iterator it;
it = m_instance->plans.find(handle);
if (it != m_instance->plans.end())
{
return it->second;
}
else
{
return NULL;
}
}
size_t CUDPPPlanManager::numCTAs(KernelPointer kernel)
{
if (m_instance == NULL)
{
return 0;
}
return m_instance->numCTAsTable[kernel];
}
void CUDPPPlanManager::computeNumCTAs(KernelPointer kernel, size_t bytesDynamicSharedMem, size_t threadsPerBlock)
{
Instantiate();
m_instance->numCTAsTable[kernel] = maxBlocks(kernel, bytesDynamicSharedMem, threadsPerBlock);
}