Skip to content
Prev 1052 / 2152 Next

Looking for some function to determine how many cores I have

Hi
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
[1] 4


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