3

I am doing dual core optimization by multi-threading, and it works like this: If the device has dual-core processor, two threads are created to do the computation, and if the device has only one-core processor, only one thread is created to do the computation.

My question is: how does my program know whether a device is dual-core or not? I just want to have one program that can run on both dual-core and one-core devices, so it has to be able to know that information.

code like this:

    if( xxx_API_is_device_dual_core() )  // Inside if() is the expected API
    {
     saveThread = new SaveThread[2];
    }
    else
    {
    saveThread = new SaveThread[1];
    }

Thank you very much for any help!

Jack
  • 125
  • 1
  • 1
  • 8

2 Answers2

3

The Runtime.availableProcessors() doesn't seem to work correctly for all Android devices (for example, it only returns "1" on my dual-core Galaxy S II). There may be some confusion between physical CPUs, and virtual CPUs, aka Cores.

The most reliable method I've found is described in this forum post. Basically, you have to count the virtual CPU devices in /sys/devices/system/cpu/. This will work with dual-core and quad-core devices with no modifications.

I've tested this method on my Galaxy S II (2 cores) and Asus Transformer Prime (4 cores) and it reports correctly. Here's some sample code (taken from my answer to this question):

/**
 * Gets the number of cores available in this device, across all processors.
 * Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu"
 * @return The number of cores, or 1 if failed to get result
 */
private int getNumCores() {
    //Private Class to display only CPU devices in the directory listing
    class CpuFilter implements FileFilter {
        @Override
        public boolean accept(File pathname) {
            //Check if filename is "cpu", followed by a single digit number
            if(Pattern.matches("cpu[0-9]", pathname.getName())) {
                return true;
            }
            return false;
        }      
    }

    try {
        //Get directory containing CPU info
        File dir = new File("/sys/devices/system/cpu/");
        //Filter to only list the devices we care about
        File[] files = dir.listFiles(new CpuFilter());
        //Return the number of cores (virtual CPU devices)
        return files.length;
    } catch(Exception e) {
        //Default to return 1 core
        return 1;
    }
}
Community
  • 1
  • 1
David
  • 1,698
  • 16
  • 27
2

Is Runtime.availableProcessors() fails to report correctly on the 2-core device?

denis.solonenko
  • 11,645
  • 2
  • 28
  • 23
  • wow, this API seems to be what I need! I'll check it in a minute and let you whether it works. – Jack Sep 29 '11 at 05:55
  • Runtime.availableProcessors() returns 2 for dual-core device and it's exactly what I have expected. Thank you Denis! – Jack Sep 29 '11 at 06:11