-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcpu_detector.cpp
More file actions
63 lines (55 loc) · 1.38 KB
/
cpu_detector.cpp
File metadata and controls
63 lines (55 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "cpu_detector.h"
#include <QSysInfo>
#include <QDebug>
#ifdef Q_OS_WIN
#include <intrin.h>
#endif
bool CPUDetector::hasAVX2() {
#ifdef Q_OS_WIN
int regs[4];
__cpuid(regs, 0);
int nIds = regs[0];
if (nIds >= 7) {
__cpuidex(regs, 7, 0);
return (regs[1] & (1 << 5)) != 0; // EBX bit 5
}
#endif
return false;
}
bool CPUDetector::hasAVX512() {
#ifdef Q_OS_WIN
int regs[4];
__cpuid(regs, 0);
int nIds = regs[0];
if (nIds >= 7) {
__cpuidex(regs, 7, 0);
return (regs[1] & (1 << 16)) != 0; // EBX bit 16
}
#endif
return false;
}
bool CPUDetector::hasSSE42() {
#ifdef Q_OS_WIN
int regs[4];
__cpuid(regs, 1);
return (regs[2] & (1 << 20)) != 0; // ECX bit 20
#endif
return false;
}
QString CPUDetector::getCPUInfo() {
QString info;
info += "CPU: " + QSysInfo::prettyProductName() + "\n";
info += "Architecture: " + QSysInfo::currentCpuArchitecture() + "\n";
info += "SSE4.2: " + QString(hasSSE42() ? "Yes" : "No") + "\n";
info += "AVX2: " + QString(hasAVX2() ? "Yes" : "No") + "\n";
info += "AVX-512: " + QString(hasAVX512() ? "Yes" : "No") + "\n";
return info;
}
bool CPUDetector::isCompatible() {
// 检查是否支持AVX2(llama.cpp的最低要求)
if (!hasAVX2()) {
qDebug() << "CPU does not support AVX2";
return false;
}
return true;
}