// Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.
// IACA (Intel's Code Analyzer) analyzes instruction latencies, but only for // code between special markers. These functions embed such markers in an // executable, but only for reading via IACA - they deliberately trigger a // crash if executed to ensure they are removed in normal builds.
// Call before the region of interest. static JXL_INLINE void BeginIACA() { #if JXL_IACA_ENABLED && (JXL_COMPILER_GCC || JXL_COMPILER_CLANG) asmvolatile( // UD2 "instruction" raises an invalid opcode exception. ".byte 0x0F, 0x0B\n\t" // Magic sequence recognized by IACA (MOV + addr32 fs:NOP). This actually // clobbers EBX, but we don't care because the code won't be run, and we // want IACA to observe the same code the compiler would have generated // without this marker. "movl $111, %%ebx\n\t" ".byte 0x64, 0x67, 0x90\n\t"
:
: // (Allegedly) clobbering memory may prevent reordering.
: "memory"); #endif
}
// Call after the region of interest. static JXL_INLINE void EndIACA() { #if JXL_IACA_ENABLED && (JXL_COMPILER_GCC || JXL_COMPILER_CLANG) asmvolatile( // See above. "movl $222, %%ebx\n\t" ".byte 0x64, 0x67, 0x90\n\t" // UD2 ".byte 0x0F, 0x0B\n\t"
:
: // (Allegedly) clobbering memory may prevent reordering.
: "memory"); #endif
}
// Add to a scope to mark a region. struct ScopeIACA {
JXL_INLINE ScopeIACA() { BeginIACA(); }
JXL_INLINE ~ScopeIACA() { EndIACA(); }
};
} // namespace jxl
#endif// LIB_JXL_BASE_IACA_H_
Messung V0.5
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.