__check_isa_support, __check_arch_support

Microsoft'a Özgü

__check_isa_support - işlemcinin çalışma zamanında belirtilen ISA özelliğini ve AVX10 sürümünü destekleyip desteklemediğini algılar. __check_arch_support - Kemer bayrağının (bkz /arch . (x86), /arch (x64)) derleme zamanında belirtilen ISA özelliğini ve AVX10 sürümünü destekleyip desteklemediğini algılar.

Sözdizimi

_Bool __check_isa_support(
   unsigned feature,
   unsigned avx10_version
);

_Bool __check_arch_support(
   unsigned feature,
   unsigned avx10_version
);
bool __check_isa_support(
   unsigned feature,
   unsigned avx10_version
);

bool __check_arch_support(
   unsigned feature,
   unsigned avx10_version
);

Parametreler

özellik
[in] Denetlenecek ISA özelliği.

avx10_version
[in] Denetlenecek AVX10 sürümü. AVX10 sürüm denetimi gerekli değilse 0.

Dönüş değeri

__check_isa_support, işlemcinin ve çalıştırma zamanında destekleyip desteklemediğini feature avx10_version döndürürtrue, false aksi takdirde. __check_arch_supportbayrağını /arch desteklerse feature ve avx10_version derleme zamanında döndürürtrue, false aksi takdirde.

Gereksinimler

Içsel Mimari
__check_isa_support x86, x64
__check_arch_support x86, x64

Üst bilgi dosyası <immintrin.h>

Açıklamalar

__check_isa_support , en sık kullanılan CPU özelliklerini dinamik olarak denetlemek için iç özelliklere daha hızlı bir alternatif __cpuid sağlar. iç __check_arch_support , ISA uzantılarını temel alan derleme zaman kodu seçimine bir alternatif predefined macros sağlar.

Aşağıdaki özellik değerleri bu iç bilgilerde kullanılabilir. Bu değerler içinde isa_availability.htanımlanır.

Özellik Değeri Adı Açıklama
__IA_SUPPORT_VECTOR128 Uzunluğu 128 bit'e kadar olan vektör yönergeleri. Bu özellik SSE2 veya sonraki uzantılar için etkinleştirilmiştir
__IA_SUPPORT_VECTOR256 256 bit uzunluğa sahip vektör yönergeleri. Bu özellik AVX2 veya sonraki uzantılar için etkinleştirilmiştir
__IA_SUPPORT_VECTOR512 Uzunluğu 512 bit'e kadar olan vektör yönergeleri. Bu özellik AVX-512 veya üzeri uzantılar için etkinleştirilmiştir
__IA_SUPPORT_AVX10 AVX10 desteği. Bu özellik AVX10.1 veya üzeri uzantılar için etkinleştirilmiştir
__IA_SUPPORT_SSE42 SSE4.2 desteği
__IA_SUPPORT_SV128X 128 bit skaler için AVX-512 yönergeleri. Dönüşümler gibi bazı yararlı AVX-512 yönergelerinin skaler kodda kullanılabileceğini belirtmek için kullanılabilir
__IA_SUPPORT_AVX10_2 AVX10.2 desteği
__IA_SUPPORT_APX APX desteği
__IA_SUPPORT_FP16 Yarım duyarlıklı kayan nokta yönerge desteği

OR(|) işleci kullanılarak birden çok özellik değeri birleştirilebilir.

İç __check_arch_support her zaman derleme zamanında değerlendirilebilir, bu nedenle iyileştirilmiş kodda kullanılması, yürütülecek ek yönergeler eklemez. Visual Studio 2022 sürüm 17.10'da bu iç ayrıntılar için destek eklendi.

Örnek

Bu örnek, çift duyarlıklı değerlerin 64 bit işaretli tamsayı değerlerine dönüştürülmesi vektörleştirmek için 256 bit AVX-512 yönergelerini kullanır. Vektör kodu tarafından işlenmeyen kaynak değerleri dönüştürmeye yönelik kuyruk döngüsü, vektör kodunun yürütülememesi durumunda da kullanılır. Derleme zamanı desteği çalışma zamanı desteğinden önce denetlenerek mümkünse çalışma zamanı denetiminden kaçınılabilir.

// Compile this test with: /EHsc /O2
#include <iostream>
#include <vector>
#include <immintrin.h>
#include <isa_availability.h>
using namespace std;

#define CHECK_INSTRUCTION_SUPPORT(a,v) \
        (__check_arch_support((a),(v)) || __check_isa_support((a),(v)))

int main()
{
    vector<double> input = {0.3, 1.4, 2.5, 3.6, 4.7, 5.8, 6.9, 8.0, 9.1, 11.14};
    vector<__int64> output(10, 0);
    int i = 0;

    if (CHECK_INSTRUCTION_SUPPORT(__IA_SUPPORT_SV128X | __IA_SUPPORT_VECTOR256, 0))
    {
        for (; i < input.size() - 4; i += 4)
        {
            __m256i values = _mm256_cvttpd_epi64(_mm256_load_pd(&input[i]));
            _mm256_storeu_epi64((void*)&output[i], values);
        }
    }
    for (; i < input.size(); i++)
    {
        output[i] = input[i];
    }

    for (i = 0; i < output.size(); i++) {
        cout << "output[" << i << "] = " << output[i] << endl;
    }
}
output[0] = 0
output[1] = 1
output[2] = 2
output[3] = 3
output[4] = 4
output[5] = 5
output[6] = 6
output[7] = 8
output[8] = 9
output[9] = 11

END Microsoft'a Özgü

Ayrıca bkz.

Derleyici iç bilgileri