主にレジスタの長さに基づいて区別する3 つのシステムでビルドするコードを作成しようとしています。
- SSE (128 ビット)
- AVX (256 ビット)
- MIC (インテルのナイツ コーナー 512 ビット)
私のMakefileは、次のようなconfig.mkから選択できる、選択したシステムに応じて実行可能ファイルをビルドします。
MIC=0 # 0 = no MIC kernels | 1 = build MIC kernels
AVX=0 # 0 = no AVX kernels | 1 = build AVX kernels
SSE=0 # 0 = no SSE kernels | 1 = build SSE kernels
私のメインのメイクファイルは次のとおりです。
# CONFIGURE BUILD SYSTEM
include config.mk
CXXFLAGS = -O2 -g -pedantic -Wextra -Wno-format -Wall
ifeq '$(strip $(SSE))' '1'
CXXFLAGS += -msse4.2
TAG = LIMA
#@echo "$(CXXFLAGS)"
endif
ifeq '$(strip $(AVX))' '1'
CXXFLAGS += -mavx
TAG = SANDY
#@echo "$(CXXFLAGS)"
endif
ifeq '$(strip $(MIC))' '1'
CXXFLAGS += -mmic
TAG = MIC
#@echo "$(CXXFLAGS)"
endif
CC = icc
CXX = icpc
INCLUDES = -I./src/includes
CXXFLAGS := $(CXXFLAGS) $(DEFINES) $(INCLUDES)
DEFINES = -D_GNU_SOURCE -DDEBUG
LINKER = $(CXX) -liomp5 -lpthread
LIBS =
LFLAGS =
# BUILD PARAMETERS
TARGET = SpMvM_$(TAG)
SRC_DIR = ./src
MAKE_DIR = ./
Q ?= @
BUILD_DIR = ./$(TAG)
VPATH = $(SRC_DIR)
OBJ = $(addprefix $(BUILD_DIR)/,$(notdir $(patsubst %.cpp,%.o, $(wildcard $(SRC_DIR)/*.cpp)) ))
${TARGET}: $(BUILD_DIR) $(OBJ)
@echo "===> LINKING $(TARGET)"
@echo "$(Q)${LINKER} ${LFLAGS} -o $(TARGET) $(OBJ) $(LIBS)"
$(Q)${LINKER} ${LFLAGS} -o $(TARGET) $(OBJ) $(LIBS)
$(BUILD_DIR)/%.o: %.cpp
@echo "===> COMPILE $@"
@echo "$(Q)$(CXX) $(CXXFLAGS) -c $< -o $@"
$(Q)$(CXX) $(CXXFLAGS) -c $< -o $@
$(BUILD_DIR):
@mkdir $(BUILD_DIR)
.PHONY: clean distclean
clean:
@echo "===> CLEAN"
@rm -rf $(BUILD_DIR)
@rm -f tags
@rm -f $(TARGET)
@rm -f *~
distclean: clean
@echo "===> DIST CLEAN"
@rm -f $(TARGET)
@rm -f tags
clean_dir:
@echo "===> CLEAN DIR"
@rm -rf LIMA/ SANDY/ MIC/
clean_all:
@echo "===> CLEAN ALL"
@rm -f SpMvM_LIMA SpMvM_SANDY
@rm -rf LIMA/ SANDY/ MIC/
config.mkは、適切なコンパイラ フラグ (-msse4.2、-mavx、-mmic) を選択するのに役立ちます。
テスト コードは、C++ で記述された単純な「HELLO WORLD」アプリケーションです。SSEおよびAVXシステムではエラーなく動作します。
MICでコンパイルしようとすると、次のエラーが表示されます。
===> COMPILE MIC/main.o
@icpc -O2 -g -pedantic -Wextra -Wno-format -Wall -openmp -mmic -I./src/includes -c ./src/main.cpp -o MIC/main.o
===> LINKING SpMvM_MIC
@icpc -liomp5 -lpthread -o SpMvM_MIC ./MIC/main.o
ipo: warning #11010: file format not recognized for ./MIC/main.o
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
ld: ./MIC/main.o: Relocations in generic ELF (EM: 181)
./MIC/main.o: could not read symbols: File in wrong format
make: *** [SpMvM_MIC] Error 1
ipoエラーは、異なるシステムでのコンパイルとリンクに関係があることを理解するのに十分な検索を行いました。しかし、私の場合は意味がありません。実行可能ファイル (SpMvM_$(TAG)) とオブジェクト ファイル ($(BUILD_DIR)/) が各システムで作成され、それらはすべて、対象となるシステムに応じて接尾辞 ($(TAG) = LIMA、SANDY、MIC) を付けて命名されます。使用済み。その結果、一方のシステムからのオブジェクト ファイルが、もう一方のシステムへのリンクまたは使用で重複します。
何が間違っているのか教えてください。