forked from FFmpeg/FFmpeg
lavu/kperf: use ff_thread_once()
Signed-off-by: J. Dekker <jdek@itanimul.li>
This commit is contained in:
parent
f614390ecc
commit
c866a099b2
4 changed files with 22 additions and 58 deletions
|
@ -16,7 +16,10 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "avassert.h"
|
||||||
#include "macos_kperf.h"
|
#include "macos_kperf.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
@ -68,69 +71,35 @@ KPERF_LIST
|
||||||
#define CONFIG_COUNT 8
|
#define CONFIG_COUNT 8
|
||||||
#define KPC_MASK (KPC_CLASS_CONFIGURABLE_MASK | KPC_CLASS_FIXED_MASK)
|
#define KPC_MASK (KPC_CLASS_CONFIGURABLE_MASK | KPC_CLASS_FIXED_MASK)
|
||||||
|
|
||||||
static int ff_kperf_was_init = 0;
|
static void kperf_init(void)
|
||||||
|
|
||||||
int ff_kperf_init()
|
|
||||||
{
|
{
|
||||||
uint64_t config[COUNTERS_COUNT] = {0};
|
uint64_t config[COUNTERS_COUNT] = {0};
|
||||||
void *kperf = NULL;
|
void *kperf = NULL;
|
||||||
|
|
||||||
if (ff_kperf_was_init)
|
av_assert0(kperf = dlopen("/System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf", RTLD_LAZY));
|
||||||
return 0;
|
|
||||||
|
|
||||||
kperf = dlopen("/System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf", RTLD_LAZY);
|
#define F(ret, name, ...) av_assert0(name = (name##proc *)(dlsym(kperf, #name)));
|
||||||
if (!kperf) {
|
|
||||||
fprintf(stderr, "kperf: kperf = %p\n", kperf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define F(ret, name, ...) \
|
|
||||||
name = (name##proc *)(dlsym(kperf, #name)); \
|
|
||||||
if (!name) { \
|
|
||||||
fprintf(stderr, "kperf: %s = %p\n", #name, (void *)name); \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
KPERF_LIST
|
KPERF_LIST
|
||||||
#undef F
|
#undef F
|
||||||
|
|
||||||
if (kpc_get_counter_count(KPC_MASK) != COUNTERS_COUNT) {
|
av_assert0(kpc_get_counter_count(KPC_MASK) == COUNTERS_COUNT);
|
||||||
fprintf(stderr, "kperf: wrong fixed counters count\n");
|
av_assert0(kpc_get_config_count(KPC_MASK) == CONFIG_COUNT);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kpc_get_config_count(KPC_MASK) != CONFIG_COUNT) {
|
|
||||||
fprintf(stderr, "kperf: wrong fixed config count\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
config[0] = CPMU_CORE_CYCLE | CFGWORD_EL0A64EN_MASK;
|
config[0] = CPMU_CORE_CYCLE | CFGWORD_EL0A64EN_MASK;
|
||||||
// config[3] = CPMU_INST_BRANCH | CFGWORD_EL0A64EN_MASK;
|
// config[3] = CPMU_INST_BRANCH | CFGWORD_EL0A64EN_MASK;
|
||||||
// config[4] = CPMU_SYNC_BR_ANY_MISP | CFGWORD_EL0A64EN_MASK;
|
// config[4] = CPMU_SYNC_BR_ANY_MISP | CFGWORD_EL0A64EN_MASK;
|
||||||
// config[5] = CPMU_INST_A64 | CFGWORD_EL0A64EN_MASK;
|
// config[5] = CPMU_INST_A64 | CFGWORD_EL0A64EN_MASK;
|
||||||
|
|
||||||
if (kpc_set_config(KPC_MASK, config)) {
|
av_assert0(kpc_set_config(KPC_MASK, config) == 0 || !"the kperf API needs to be run as root");
|
||||||
fprintf(stderr, "kperf: kpc_set_config failed\n");
|
av_assert0(kpc_force_all_ctrs_set(1) == 0);
|
||||||
return -1;
|
av_assert0(kpc_set_counting(KPC_MASK) == 0);
|
||||||
|
av_assert0(kpc_set_thread_counting(KPC_MASK) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kpc_force_all_ctrs_set(1)) {
|
void ff_kperf_init(void)
|
||||||
fprintf(stderr, "kperf: kpc_force_all_ctrs_set failed\n");
|
{
|
||||||
return -1;
|
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||||
}
|
ff_thread_once(&init_static_once, kperf_init);
|
||||||
|
|
||||||
if (kpc_set_counting(KPC_MASK)) {
|
|
||||||
fprintf(stderr, "kperf: kpc_set_counting failed\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kpc_set_thread_counting(KPC_MASK)) {
|
|
||||||
fprintf(stderr, "kperf: kpc_set_thread_counting failed\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ff_kperf_was_init = 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t ff_kperf_cycles()
|
uint64_t ff_kperf_cycles()
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
int ff_kperf_init(void);
|
void ff_kperf_init(void);
|
||||||
uint64_t ff_kperf_cycles(void);
|
uint64_t ff_kperf_cycles(void);
|
||||||
|
|
||||||
#endif /* AVUTIL_MACOS_KPERF_H */
|
#endif /* AVUTIL_MACOS_KPERF_H */
|
||||||
|
|
|
@ -131,12 +131,11 @@
|
||||||
|
|
||||||
#define START_TIMER \
|
#define START_TIMER \
|
||||||
uint64_t tperf; \
|
uint64_t tperf; \
|
||||||
if (ff_kperf_init()) \
|
ff_kperf_init(); \
|
||||||
av_log(NULL, AV_LOG_ERROR, "ff_kperf_init() failed\n"); \
|
tperf = ff_kperf_cycles();
|
||||||
tperf = kperf_cycles();
|
|
||||||
|
|
||||||
#define STOP_TIMER(id) \
|
#define STOP_TIMER(id) \
|
||||||
TIMER_REPORT(id, kperf_cycles() - tperf);
|
TIMER_REPORT(id, ff_kperf_cycles() - tperf);
|
||||||
|
|
||||||
#elif defined(AV_READ_TIME)
|
#elif defined(AV_READ_TIME)
|
||||||
#define START_TIMER \
|
#define START_TIMER \
|
||||||
|
|
|
@ -641,11 +641,7 @@ static int bench_init_linux(void)
|
||||||
#elif CONFIG_MACOS_KPERF
|
#elif CONFIG_MACOS_KPERF
|
||||||
static int bench_init_kperf(void)
|
static int bench_init_kperf(void)
|
||||||
{
|
{
|
||||||
if (ff_kperf_init()) {
|
ff_kperf_init();
|
||||||
fprintf(stderr, "checkasm must be run as root to use kperf on macOS\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Add table
Reference in a new issue