7

重複の可能性:
Mac OS X Lion で OpenMP を使用するとコンパイルが失敗する (memcpy および SSE 組み込み関数)

pthreaded コードを OpenMP に変換することにしました。

以前は、Intel/GCC アトミック ビルトイン (__sync_fetch_and_addファミリ) を使用して多くの同期を行っていました。

lock xadd予想どおり、これらは x64 で GCC と ICC の両方にコンパイルされます。

しかし、GCC でコンパイルする-fopenmpと、それらの場所で呼び出しが開始されます。callq ___sync_fetch_and_add_8と家族。ICC は適切に最適化されたコードを生成します。

編集:リンカーはそのGCCコードのリンクを拒否します:

$ gcc -O3 -Wall *.o -lpthread -ldl -lgomp
Undefined symbols for architecture x86_64:
  "___sync_fetch_and_add_8"

Edit2:これは Apple の GCC に固有のようです。Red Hat gcc 4.4.6 ではその現象が発生しません

GCC がなくても同じ最適化されたインライン asm を生成するにはどうすればよい-fopenmpですか?

$ gcc -v
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~67/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

$ icc --version
icc (ICC) 12.0.2 20110112
Copyright (C) 1985-2011 Intel Corporation.  All rights reserved.

でコンパイル

icc -O3 -Wall -std=gnu99 -ipo -xSSE4.1 -axAVX -O3 -Wall -openmp
gcc -O3 -Wall -std=gnu99 -finline-functions -funroll-loops -O3 -Wall -fopenmp
4

0 に答える 0