[R-sig-hpc] Looking for some function to determine how many cores I have

Ei-ji Nakama nakama at ki.rim.or.jp
Fri Aug 5 08:41:02 CEST 2011


Hi

> I can personally see the core numbers from Windows Task Manager, however want to automate (in some extend) my calculation. Is there any function to determine that number?

If you want the number of the *cores* on Windows...

---------------------------------------------------------------------------
#include <R.h>
#include <Rdefines.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>


/* my SYSTEM_LOGICAL_PROCESSOR_INFORMATION */
typedef enum my_LOGICAL_PROCESSOR_RELATIONSHIP {
  myRelationProcessorCore,myRelationNumaNode,myRelationCache
} myLOGICAL_PROCESSOR_RELATIONSHIP;

typedef enum my_PROCESSOR_CACHE_TYPE {
  myCacheUnified,myCacheInstruction,myCacheData,myCacheTrace
} myPROCESSOR_CACHE_TYPE;

typedef struct my_CACHE_DESCRIPTOR {
  BYTE Level;
  BYTE Associativity;
  WORD LineSize;
  DWORD Size;
  myPROCESSOR_CACHE_TYPE Type;
} myCACHE_DESCRIPTOR,*myPCACHE_DESCRIPTOR;

typedef struct my_SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
  ULONG_PTR ProcessorMask;
  myLOGICAL_PROCESSOR_RELATIONSHIP Relationship;
  union {
    struct {
      BYTE Flags;
    } ProcessorCore;
    struct {
      DWORD NodeNumber;
    } NumaNode;
    myCACHE_DESCRIPTOR Cache;
    ULONGLONG Reserved[2];
  };
} mySYSTEM_LOGICAL_PROCESSOR_INFORMATION,*myPSYSTEM_LOGICAL_PROCESSOR_INFORMATION;

SEXP get_num_cores(void)
{
    SEXP cores;
    PROTECT (cores = allocVector (INTSXP, 1));
    INTEGER(cores)[0]=1;
    {
      int nums = 0;
      BOOL (WINAPI *glpi)(myPSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);
      glpi = (void *) GetProcAddress( GetModuleHandle("kernel32"),
				      "GetLogicalProcessorInformation");
      if (NULL != glpi) {
	DWORD len = 0;
	glpi(NULL, &len);
	{
	  mySYSTEM_LOGICAL_PROCESSOR_INFORMATION
buf[len/sizeof(mySYSTEM_LOGICAL_PROCESSOR_INFORMATION)];
	  int i;
	  glpi(buf, &len);
	  for ( i=0; i<len/sizeof(mySYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
	    if( buf[i].Relationship == myRelationProcessorCore )
	      nums++;
	}
      }else{
	SYSTEM_INFO system_info;
	GetSystemInfo(&system_info);
	nums = system_info.dwNumberOfProcessors;
      }
      INTEGER(cores)[0] = nums;
    }
    UNPROTECT (1);
    return cores;
}
-----------------------------------------------------------------------------------------------
you save this in numofcores.c
C:> <snip>R CMD SHLIB numofcores.c

C:\> <snip>R
> dyn.load("numofcores.dll")
> .Call("get_num_cores")
[1] 4


Best Regards,
--
EI-JI Nakama  <nakama (a) ki.rim.or.jp>
"\u4e2d\u9593\u6804\u6cbb"  <nakama (a) ki.rim.or.jp>



More information about the R-sig-hpc mailing list