3

実行中の C アプリケーション内から CPU タイプを判別する最も簡単な方法は何ですか? 現在の CPU のコア数と、NEON ユニットがあるかどうかを調べたいと思っています。簡単な解決策の 1 つは、/proc の cpuinfo フラグをチェックすることですが、それが高速で信頼できる方法かどうかはわかりません。

4

4 に答える 4

3

このドキュメントを使用して、ネオンのサポートを確認できます。コア数を取得するには、このスレッドを読み、このページを見てください。

于 2013-02-22T13:52:56.307 に答える
1

あなたはYepppを使うことができます!CPUに関する多くの情報を取得するためのライブラリ。この情報には Java バインディングを介してアクセスすることもできるため、 や などのいくつかのネイティブ メソッドをクラスで定義しprocessGeneric()processNeon()CPU がサポートしている場合にのみ NEON メソッドを呼び出すことができます。

import info.yeppp.Library;
import info.yeppp.ArmCpuSimdFeature;
import info.yeppp.CpuMicroarchitecture;

if (Library.isSupported(ArmCpuSimdFeature.NEON)) {
    if (Library.getMicroarchitecture().equals(CpuMicroarchitecture.Krait)) {
        /* Special NEON implementation for recent Qualcomm processors */
        nativeClass.processKrait();
    } else {
        /* Generic NEON implementation */
        nativeClass.processNeon();
    }
} else {
    /* Generic implementation without NEON */
    nativeClass.processGeneric();
}
于 2013-02-23T09:01:35.080 に答える
0

を使用して、Build.SUPPORTED_ABISCPU Abi バージョン (例: arm64-v8a、armeabi-v7a など) を確認できます。

また、/proc/cpuinfoファイルを使用してネオンがサポートされていることを確認します。

アビ

サンプルコード

@SuppressWarnings("deprecation")
public static List<String> getSupportedABIs() {
    if (Build.VERSION.SDK_INT >= 21) {
        return Arrays.asList(Build.SUPPORTED_ABIS);
    } else {
        return Arrays.asList(Build.CPU_ABI, Build.CPU_ABI2);
    }
}

サンプル出力は次のとおりです。

|    device     |   arch     |         Abi list
| Moto Nexus 6  | arm 32bit  | [armeabi-v7a, armeabi]
| Huawei Mate 8 | arm 64bit  | [arm64-v8a, armeabi-v7a, armeabi]
| OPPO R7s      | arm 64 bit | [arm64-v8a, armeabi-v7a, armeabi]
| Moto X Style  | arm 64 bit | [arm64-v8a, armeabi-v7a, armeabi]

ネオン

「cat /proc/cpuinfo」の出力例を次に示します。

shell@mako:/ $ cat /proc/cpuinfo
Processor   : ARMv7 Processor rev 2 (v7l)
processor   : 0
BogoMIPS    : 13.53

processor   : 1
BogoMIPS    : 13.53

processor   : 2
BogoMIPS    : 13.53

processor   : 3
BogoMIPS    : 13.53

Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0x06f
CPU revision    : 2

Hardware    : QCT APQ8064 MAKO
Revision    : 000b
Serial      : 0000000000000000

線に気をつけてFeatures。CPU がサポートするすべての機能が含まれています。注:neon機能がリストされています。

したがって、現在のデバイスがサポートされているかどうかを確認する非常に簡単な方法はneon、 を作成しInputStreamReader("/proc/cpuinfo")て行を読むだけFeaturesです。

ところで

上記の方法は、ネイティブ ライブラリの使用を回避しようとします。CPU に関する詳細情報が必要な場合は、公式の NDK ライブラリcpufeaturesを試してください。そしてndk-sampleがあります。

于 2016-10-09T02:58:04.913 に答える
-1

NDK タグがあるので、ここに C コンテキストの回答があります。最新の NDK を使用する場合、Android のcpu-features ライブラリを使用することが期待されていると思います。

cpu-features.hand cpu-features.cfrom$ANDROID_NDK_ROOT/sources/android/cpufeaturesをプロジェクト ソース ツリーにコピーします。ソースの一部としてコンパイルします。

それで...


... 実行中の C アプリケーション内から CPU タイプを判別しますか?

CPU が ARMv7 であるかどうかをテストするには、次の手順を実行します。Android のドキュメントには、最初にファミリをテストするように記載されていandroid_getCpuFamily()ます。

bool IsARMv7()
{
#if defined(__ANDROID__) && (defined(__aarch64__) || defined(__arm__))
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_ARMv7) != 0))
            return true;
#endif
    return false;
}

... 現在の CPU のコア数と NEON ユニットの有無

NEON をテストするには、次のコードを使用します。NEON は ARMv8/Aarch64 では ASIMD と呼ばれます。

bool HasNEON()
{
#if defined(__ANDROID__) && defined(__aarch64__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM64) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM64_FEATURE_ASIMD) != 0))
            return true;
#elif defined(__ANDROID__) && defined(__arm__)
    if (((android_getCpuFamily() & ANDROID_CPU_FAMILY_ARM) != 0) &&
        ((android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0))
            return true;
#endif
     return false;
}

cpu-features ライブラリのドキュメントによると、CPU コア数には以下を使用します。使ったことはないですけどね。

int  android_getCpuCount(void);
于 2018-07-08T05:31:24.633 に答える