Есть ли API, который сообщает, является ли устройство Android двухъядерным или нет?

Я делаю двухъядерную оптимизацию с помощью многопоточности, и она работает следующим образом: если устройство имеет двухъядерный процессор, для вычислений создаются два потока, а если устройство имеет только одноядерный процессор, то только один поток создан, чтобы делать вычисления.

Мой вопрос: как моя программа узнает, является ли устройство двухъядерным или нет? Я просто хочу иметь одну программу, которая может работать как на двухъядерных, так и на одноядерных устройствах, поэтому она должна знать эту информацию.

код как это:

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

Большое спасибо за любую помощь!

2 ответа

Решение

Не запускается ли Runtime.availableProcessors() правильно на 2-ядерном устройстве?

Кажется, что Runtime.availableProcessors() не работает правильно для всех устройств Android (например, он возвращает только "1" на моем двухъядерном Galaxy S II). Может быть некоторая путаница между физическими процессорами и виртуальными процессорами, также называемыми ядрами.

Самый надежный метод, который я нашел, описан в этом сообщении на форуме. По сути, вы должны считать виртуальные процессорные устройства в /sys/devices/system/cpu/. Это будет работать с двухъядерными и четырехъядерными устройствами без изменений.

Я протестировал этот метод на своих Galaxy S II (2 ядра) и Asus Transformer Prime (4 ядра), и он сообщает правильно. Вот пример кода (взят из моего ответа на этот вопрос):

/**
 * 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;
    }
}
Другие вопросы по тегам