私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレGCCについて part9
gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ○
レスフィルター : (試験中)
>>300
OSじゃなく処理系だろ
OSじゃなく処理系だろ
プリプロセッサの処理中にメッセージを表示したいのですが、
gccでも可能でしょうか?
Visual C++ では #pragma message("msg") などと書けばできたのですが。
gccでも可能でしょうか?
Visual C++ では #pragma message("msg") などと書けばできたのですが。
>>306
http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
によると、
#pragma message "Compiling " __FILE__ "..."
とか出来るっぽいぜ
http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
によると、
#pragma message "Compiling " __FILE__ "..."
とか出来るっぽいぜ
>>305
今はだめだろ。CPUいっぱいあるから。
今はだめだろ。CPUいっぱいあるから。
ついでにいうとCPU, OSの組み合わせによってはRDTSCがエミュになってしまい
数百クロックを要する。
だがそのような環境では逆に全コアでタイマカウンタが一貫してたりする。
数百クロックを要する。
だがそのような環境では逆に全コアでタイマカウンタが一貫してたりする。
>>307
ありがとうございます。しかし試してみたところダメでした。
-Wunknown-pragmasでコンパイルしたら「無視しました」みたいなメッセージが出ました。
gccのバージョンによるんですかね。4.3.2でした。
ありがとうございます。しかし試してみたところダメでした。
-Wunknown-pragmasでコンパイルしたら「無視しました」みたいなメッセージが出ました。
gccのバージョンによるんですかね。4.3.2でした。
>>307
#warningで出来るかなと思ったら引数のマクロ展開はしないとか
ふざけた事を抜かしているのであまり使えないな。 この程度は
出来るけど。
#warning Message
$ gcc -c source.c
source.c:1:2: warning: #warning Message
waring:#warning が冗長で醜いなあw
#warningで出来るかなと思ったら引数のマクロ展開はしないとか
ふざけた事を抜かしているのであまり使えないな。 この程度は
出来るけど。
#warning Message
$ gcc -c source.c
source.c:1:2: warning: #warning Message
waring:#warning が冗長で醜いなあw
GCC4.4.1は-msse・最大最適化でコンパイルすると、float演算はSSE命令により
自動ベクトル化されるが、整数演算はベクトル化されない。整数移動はベクトル化
されるが、float用SSE命令が使われていた。GCCはMMXや3DNOWコードを吐かないの?
自動ベクトル化されるが、整数演算はベクトル化されない。整数移動はベクトル化
されるが、float用SSE命令が使われていた。GCCはMMXや3DNOWコードを吐かないの?
MMXは基本的にshort以下の整数に使うもんだし
飽和演算とか利用してこそだし
あまり自動最適化には向かないんじゃない
飽和演算とか利用してこそだし
あまり自動最適化には向かないんじゃない
整数はベクタ化の恩恵を受けにくいからじゃないかな。
単なるコピーならfloat32でも同じことだし。
単なるコピーならfloat32でも同じことだし。
GCC4が登場した頃には整数SIMDができるSSE2の登場から数年経過しており、MMXに
よる整数SIMDの需要が少なかったからか?さらに、GCC4登場初期はスマートフォンや
PDAにiwmmxtが搭載されていたが、そもそも当時はスマートフォンが普及しておらず
MMX系の需要は少なかったからか。で、今ではスマートフォンが普及しgccに
armの128bit自動ベクトル化が搭載されたが、既に時代遅れのiwmmxtは対象外
という事か。
よる整数SIMDの需要が少なかったからか?さらに、GCC4登場初期はスマートフォンや
PDAにiwmmxtが搭載されていたが、そもそも当時はスマートフォンが普及しておらず
MMX系の需要は少なかったからか。で、今ではスマートフォンが普及しgccに
armの128bit自動ベクトル化が搭載されたが、既に時代遅れのiwmmxtは対象外
という事か。
gcc4って最初かなりすごかったのに、後からどんどん遅くbuggyになってるよね
プロプライエタリの工作員が本気出し始めたのかな
プロプライエタリの工作員が本気出し始めたのかな
4.5からbackendをplugin化出来るようになったからいつでもllvmに逃げられるようになったけどね
Benchmarks Of GCC 4.5.0 Compiler Performance
http://www.phoronix.com/scan.php?page=article&item=gcc_45_benchmarks
http://www.phoronix.com/scan.php?page=article&item=gcc_45_benchmarks
ポインタ渡しの関数内でSIMDを使いたい場合、仮引数をstruct{long __attribute__((aligned(16)))
a[2][8];}*aのようにして、a->a[i][j]でアクセスしないとアライメントデータとして扱われない。
ソース冒頭で構造体型定義を使っても可。もっと簡単にポインタがアライメントされて
いる事をgccに分からせる方法はないの?
また、func(struct{long __attribute__((aligned(16))) a[2][32];}*__restrict a,
struct{long __attribute__((aligned(16))) a[2][32];}*__restrict b, int *__restrict c){
int i;for (i=0;i<8;i++){a->a[0][*c*4+i]=b->a[0][i];a->a[1][*c*4+i]=b->a[1][i];} }
のように二次元配列を2つ受け取り、ポインタ渡しで指定されたオフセット分ずらして
転送する関数を書くと、versioning for alias requiredとなり非SIMDコードも生成
されるが、[*c*4+i]を[(*c+=0)*4+i]とすると非SIMDコードは生成されない。
>>335
OSSへの破壊工作ってあるの?
a[2][8];}*aのようにして、a->a[i][j]でアクセスしないとアライメントデータとして扱われない。
ソース冒頭で構造体型定義を使っても可。もっと簡単にポインタがアライメントされて
いる事をgccに分からせる方法はないの?
また、func(struct{long __attribute__((aligned(16))) a[2][32];}*__restrict a,
struct{long __attribute__((aligned(16))) a[2][32];}*__restrict b, int *__restrict c){
int i;for (i=0;i<8;i++){a->a[0][*c*4+i]=b->a[0][i];a->a[1][*c*4+i]=b->a[1][i];} }
のように二次元配列を2つ受け取り、ポインタ渡しで指定されたオフセット分ずらして
転送する関数を書くと、versioning for alias requiredとなり非SIMDコードも生成
されるが、[*c*4+i]を[(*c+=0)*4+i]とすると非SIMDコードは生成されない。
>>335
OSSへの破壊工作ってあるの?
>>338
マクロ使えよ
マクロ使えよ
http://codepad.org/AKWhbBiV
のコードを g++ 4.3.2 で最適化なしコンパイルして実行したら,
--Start 1--
Destructor
Destructor
--End 1--
--Start 2--
Destructor
--End 2--
Destructor
という結果になった.
(Start 2 と End 2 の間にもう1つの"Destructor"があることを期待していた)
G++ だと,返されるオブジェクトが関数のローカル変数の場合は,
戻り値用の一時オブジェクトは作成されない仕様なの?
のコードを g++ 4.3.2 で最適化なしコンパイルして実行したら,
--Start 1--
Destructor
Destructor
--End 1--
--Start 2--
Destructor
--End 2--
Destructor
という結果になった.
(Start 2 と End 2 の間にもう1つの"Destructor"があることを期待していた)
G++ だと,返されるオブジェクトが関数のローカル変数の場合は,
戻り値用の一時オブジェクトは作成されない仕様なの?
>>341
Start 2 ~のように戻り値と同じ型のローカル変数を return した場合、
C++ の規格でコピーの省略が許されている。 (ISO C++ 12.8 p15)
これに対して Start 1 ~のほうで必要になる、既存の変数から関数引数への
コピーは省略できない。
コピーの省略が許されているだけなので、実際にコピーされるかどうかは
コンパイラやコンパイルオプションやコードの複雑さなどで変わる可能性がある。
Start 2 ~のように戻り値と同じ型のローカル変数を return した場合、
C++ の規格でコピーの省略が許されている。 (ISO C++ 12.8 p15)
これに対して Start 1 ~のほうで必要になる、既存の変数から関数引数への
コピーは省略できない。
コピーの省略が許されているだけなので、実際にコピーされるかどうかは
コンパイラやコンパイルオプションやコードの複雑さなどで変わる可能性がある。
>>341
g++ の場合、それで困るようなら -fno-elide-constructors を使うという手がある。
http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/C_002b_002b-Dialect-Options.html
g++ の場合、それで困るようなら -fno-elide-constructors を使うという手がある。
http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/C_002b_002b-Dialect-Options.html
Benchmarking LLVM & Clang Against GCC 4.5
http://www.phoronix.com/scan.php?page=article&item=gcc_llvm_clang
http://www.phoronix.com/scan.php?page=article&item=gcc_llvm_clang
for (i=0;i<128;i++)c[i]=a[127-i]*b[127-i];のように配列に乗算して順番を
反転するコードもSIMD化されない。a[i]やb[i]への書き込みが禁止されているのなら、
for (i=0;i<128;i++)c[i]=a[i]*b[i];for (i=0;i<64;i++){buf=c[i];c[i]=c[127-i];
c[127-i]=buf;}としなければならない。
反転するコードもSIMD化されない。a[i]やb[i]への書き込みが禁止されているのなら、
for (i=0;i<128;i++)c[i]=a[i]*b[i];for (i=0;i<64;i++){buf=c[i];c[i]=c[127-i];
c[127-i]=buf;}としなければならない。
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
みんなの評価 : ○類似してるかもしれないスレッド
- GCCについて part8 (763) - [95%] - 2009/3/11 8:47 ☆
- GCCについて part10 (538) - [90%] - 2018/7/5 20:30
- 【激遅】AppleGCC【絶望】 (111) - [18446744073709551607%] - 2010/1/15 10:31
トップメニューへ / →のくす牧場書庫について