Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
When retrieving jobs, tasks, and nodes, you can filter and sort the results. The following C# and C++ examples show how to filter the nodes that you want to retrieve.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Hpc.Scheduler;
using Microsoft.Hpc.Scheduler.Properties;
namespace Filtering_and_Sorting_Lists_of_Objects
{
class Program
{
static void Main(string[] args)
{
IScheduler scheduler = new Scheduler();
ISchedulerCollection nodes = null;
IFilterCollection filters = null;
ISortCollection sortOn = null;
try
{
scheduler.Connect("localhost");
// Specify the filter criteria.
filters = scheduler.CreateFilterCollection();
filters.Add(FilterOperator.GreaterThanOrEqual, PropId.Node_NumCores, 1);
filters.Add(FilterOperator.HasBitSet, PropId.Node_State, NodeState.Online);
// Specify the sort criteria
sortOn = scheduler.CreateSortCollection();
sortOn.Add(SortProperty.SortOrder.Ascending, PropId.Node_NumCores);
sortOn.Add(SortProperty.SortOrder.Descending, PropId.Node_CpuSpeed);
// Get the list of nodes that match the filter criteria
// and return them in the specified sort order.
nodes = scheduler.GetNodeList(filters, sortOn);
if (nodes.Count > 0)
{
Console.WriteLine("Nodes matching filter criteria:");
Console.WriteLine("Name\t\tCores\tCPU Speed\tMemory");
foreach (ISchedulerNode node in nodes)
{
Console.WriteLine("{0}\t{1}\t{2:f2} GHz\t{3:f2} GB",
node.Name, node.NumberOfCores, node.CpuSpeed / 1000.0, node.MemorySize / 1000.0);
}
}
else
{
Console.WriteLine("No nodes match the filter criteria.");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
#include <windows.h>
#include <stdio.h>
// The Microsoft.Hpc.Scheduler.tlb and Microsoft.Hpc.Scheduler.Properties.tlb type
// libraries are included in the Microsoft HPC Pack 2008 SDK. The type libraries are
// located in the "Microsoft HPC Pack 2008 SDK\Lib\i386" or \amd64 folder. Include the rename
// attributes to avoid name collisions.
#import <Microsoft.Hpc.Scheduler.tlb> named_guids no_namespace raw_interfaces_only \
rename("SetEnvironmentVariable","SetHpcEnvironmentVariable") \
rename("AddJob", "AddHpcJob")
#import <Microsoft.Hpc.Scheduler.Properties.tlb> named_guids no_namespace raw_interfaces_only
void EnumerateNodes(IScheduler* pScheduler);
void main(void)
{
HRESULT hr = S_OK;
IScheduler* pScheduler = NULL;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Get an instance of the Scheduler object.
hr = CoCreateInstance( __uuidof(Scheduler), // CLSID_Scheduler,
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IScheduler), // IID_IScheduler,
reinterpret_cast<void **> (&pScheduler) );
if (FAILED(hr))
{
wprintf(L"CoCreateInstance(IScheduler) failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pScheduler->Connect(_bstr_t(L"localhost"));
if (FAILED(hr))
{
wprintf(L"pScheduler->Connect failed with 0x%x.\n", hr);
goto cleanup;
}
wprintf(L"Connected to localhost\n\n");
EnumerateNodes(pScheduler);
cleanup:
// Before exiting, release your instance of IScheduler.
if (pScheduler)
pScheduler->Release();
CoUninitialize();
}
void EnumerateNodes(IScheduler* pScheduler)
{
HRESULT hr = S_OK;
ISchedulerCollection* pNodes = NULL;
ISchedulerNode* pNode = NULL;
IFilterCollection* pFilters = NULL;
ISortCollection* pSortOn = NULL;
VARIANT var;
long count = 0;
long numberOfCores = 0;
long cpuSpeed = 0;
__int64 memorySize = 0;
BSTR bstr = NULL;
// Specify the filter criteria.
hr = pScheduler->CreateFilterCollection(&pFilters);
if (FAILED(hr))
{
wprintf(L"pScheduler->CreateFilterCollection failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pFilters->Add(FilterOperator_GreaterThanOrEqual, PropId_Node_NumCores, _variant_t(1));
if (FAILED(hr))
{
wprintf(L"pFilters->Add(NumCores) failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pFilters->Add(FilterOperator_HasBitSet, PropId_Node_State, _variant_t(NodeState_Online));
if (FAILED(hr))
{
wprintf(L"pFilters->Add(State) failed with 0x%x.\n", hr);
goto cleanup;
}
// Specify the sort criteria.
hr = pScheduler->CreateSortCollection(&pSortOn);
if (FAILED(hr))
{
wprintf(L"pScheduler->CreateSortCollection failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pSortOn->Add(SortOrder_Ascending, PropId_Node_NumCores);
if (FAILED(hr))
{
wprintf(L"pSortOn->Add(NumCores) failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pSortOn->Add(SortOrder_Ascending, PropId_Node_CpuSpeed);
if (FAILED(hr))
{
wprintf(L"pSortOn->Add(CpuSpeed) failed with 0x%x.\n", hr);
goto cleanup;
}
// Get the list of nodes that match the filter criteria
// and return them in the specified sort order.
hr = pScheduler->GetNodeList(pFilters, pSortOn, &pNodes);
if (FAILED(hr))
{
wprintf(L"pScheduler->GetJobIdList failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNodes->get_Count(&count);
if (FAILED(hr))
{
wprintf(L"pNodes->get_Count failed with 0x%x.\n", hr);
goto cleanup;
}
VariantInit(&var);
if (count > 0)
{
wprintf(L"The following nodes match the filter criteria.\n");
wprintf(L"Name\t\tCores\tCPU Speed\tMemory\n");
for (long i = 0; i < count; i++)
{
hr = pNodes->get_Item(i, &var);
if (FAILED(hr))
{
wprintf(L"pNodes->get_Item failed with 0x%x.\n", hr);
goto cleanup;
}
var.pdispVal->QueryInterface(IID_ISchedulerNode, reinterpret_cast<void **>(&pNode));
VariantClear(&var);
hr = pNode->get_Name(&bstr);
if (FAILED(hr))
{
wprintf(L"pNode->get_Name failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNode->get_NumberOfCores(&numberOfCores);
if (FAILED(hr))
{
wprintf(L"pNode->get_NumberOfCores failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNode->get_CpuSpeed(&cpuSpeed);
if (FAILED(hr))
{
wprintf(L"pNode->get_CpuSpeed failed with 0x%x.\n", hr);
goto cleanup;
}
hr = pNode->get_MemorySize(&memorySize);
if (FAILED(hr))
{
wprintf(L"pNode->get_MemorySize failed with 0x%x.\n", hr);
goto cleanup;
}
wprintf(L"%s\t%ld\t%.2f GHz\t%.2f GB\n",
bstr, numberOfCores,
cpuSpeed / 1000.0, memorySize / 1000.0);
pNode->Release();
pNode = NULL;
}
}
else
{
wprintf(L"No nodes match the filter criteria.");
}
cleanup:
if (pNodes)
pNodes->Release();;
if (pNode)
pNode->Release();
if (pFilters)
pFilters->Release();
if (pSortOn)
pSortOn->Release();
if (bstr)
SysFreeString(bstr);
}