私は2台のコンピュータで作業しています。 1つはAVXサポートなし、もう1つはAVXサポートなし。実行時に自分のCPUでサポートされている命令セットを見つけ、適切なコードパスを選択すると便利です。 私は、Agner Fogの提案に従ってCPUディスパッチャー(http://www.agner.org/optimize/#vectorclass)を作成しました。しかし、AVXをコンパイルしてVisual Studioとリンクすると、AVXを有効にしたコードでは、実行するとコードがクラッシュする原因になります。AVXとSSE用のビジュアルスタジオ用のcpuディスパッチャ
たとえば、私はいくつかのSSE2命令で定義されたSSE2命令セットを持つものと、AVX命令セットが定義されたものといくつかのAVX命令を持つものの2つのソースファイルを持っています。私の主な機能では、SSE2関数だけを参照すると、AVXを有効にしたAVX命令付きのソースコードを持っているため、コードはまだクラッシュします。どのように私はこれを修正することができますか?
編集: さて、私は問題を切り離したと思います。私はAgner霧のベクトルクラスを使用していると私はとして3つのソースファイルを定義しています。このクラッシュ
//file sse2.cpp - compiled with /arch:SSE2
#include "vectorclass.h"
float func_sse2(const float* a) {
Vec8f v1 = Vec8f().load(a);
float sum = horizontal_add(v1);
return sum;
}
//file avx.cpp - compiled with /arch:AVX
#include "vectorclass.h"
float func_avx(const float* a) {
Vec8f v1 = Vec8f().load(a);
float sum = horizontal_add(v1);
return sum;
}
//file foo.cpp - compiled with /arch:SSE2
#include <stdio.h>
extern float func_sse2(const float* a);
extern float func_avx(const float* a);
int main() {
float (*fp)(const float*a);
float a[] = {1,2,3,4,5,6,7,8};
int iset = 6;
if(iset>=7) {
fp = func_avx;
}
else {
fp = func_sse2;
}
float sum = (*fp)(a);
printf("sum %f\n", sum);
}
。代わりにfec_SSE2でVec4fを使用するとクラッシュしません。私はこれを理解していない。私は、AVXを持つ別のソースファイルを持っていない限り、SSE2と共にVec8fを使用することができます。 Agner霧のマニュアルでは、AVX命令セットが指定されていない限り
が「256ビットの浮動小数点ベクトルクラス(Vec8f、 Vec4d)を使用してもメリットはありませんが、あればとにかく これらのクラスを使用することが便利であろうと言いますAVXなしで をコンパイルすると、各256ビットのベクトルは単に2つの128ビットベクトルに分割されます。
しかし、SSE2でコンパイルしたVec8fとAVXでコンパイルしたVec8fの2つのソースファイルがあるとクラッシュします。
EDIT2: 私はそれは、コマンドラインから
>cl -c sse2.cpp
>cl -c /arch:AVX avx.cpp
>cl foo.cpp sse2.obj avx.obj
>foo.exe
を仕事を得ることができEDIT3: これは、しかし、
>cl -c sse2.cpp
>cl -c /arch:AVX avx.cpp
>cl foo.cpp avx.obj sse2.obj
>foo.exe
もう一つの手掛かりをクラッシュします。リンクの順序は明らかです。 avx.objがsse2.objの前にある場合はクラッシュしますが、sse2.objがavx.objより前の場合はクラッシュしません。私は正しいコードパスを選択するかどうかはわかりませんが(私は今AVXシステムにアクセスできない)、少なくともクラッシュはしません。
クラッシュの詳細はなんですか?デバッガで失敗した命令を特定しましたか? –
デバッガは、func_SSEがAVX命令を使用しようとしていることを示しています。どうしてか分かりません。しかし、私はコマンドラインを使用してクラッシュせずにコードを動作させることができました。上記のコマンドを追加しました。私はまだIDEでそれを行う方法を知らない。プラス面では、私はWindowsでコマンドラインから初めてコンパイルしました! Linuxでコンパイルする唯一の方法です。 –
IDEからリンク時コード生成を使用しましたか? –