Mantosh Kumar
Mantosh Kumar

Reputation: 5731

Why GetLogicalProcessorInformation() API does not provide the complete information about cache memory?

I was reading the great SO post about how to determine the size and other information of cache memory: Programmatically get the cache line size?

I wrote the following program to find out these information on Windows platform:

#include<Windows.h>
int main() 
{
    BOOL retval;
    SYSTEM_LOGICAL_PROCESSOR_INFORMATION *buffer = 0;
    int buffersize = 0;
    retval = GetLogicalProcessorInformation(buffer,(PDWORD)&buffersize);    
    if(retval == FALSE) 
    {
        DWORD ret = GetLastError();
        if(ret == ERROR_INSUFFICIENT_BUFFER) 
        {
            // Use the actual length required information while allocating the memory
            char* tmp = new char[buffersize];
            buffer = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION *)tmp;
            retval = GetLogicalProcessorInformation(buffer,(PDWORD)&buffersize);
            CACHE_DESCRIPTOR x;
            if(retval == TRUE) 
            {
                x = buffer->Cache;
            }
            delete [] tmp;
        }
    }
    return 0;
}

However while running/debugging the program I am not getting all information about cache(except the level of cache and its type). Below is the output of variable x

x.Level = 1
x.Associativity = 0
x.LineSize = 0
x.Size = 0
x.Type = CacheUnified

Why above program does not give the LineSize and Size information about this cache? Am I doing something wrong over here?. Is there another way to find out these information programmatically on Windows platform?.

My Platform information is:

Windows 7
64 Bit Operating System
Intel i5 CPU
Visual Studio 2010

Upvotes: 0

Views: 582

Answers (1)

Ross Ridge
Ross Ridge

Reputation: 39551

GetLogicalProcessorInformation returns more than one SYSTEM_LOGICAL_PROCESSOR_INFORMATION structure. You need to search through through the list of these structures for the one that whose Relationship value is RelationCache and whose Cache.Level is 1. The post you linked shows how do this.

Upvotes: 1

Related Questions