C++でFORTRAN並みの実行速度を出すPGを組むスレ

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++でFORTRANに近い、より速い実行速度を出すプログラムを組むには、 
どういう技術を駆使したり、どういうことをすればいいか考えるスレです。 
2デフォルトの名無しさん:2007/04/22(日) 13:27:41
C++で書いたプログラムを実行するマシンだけ
性能上げればいいんじゃね?
3デフォルトの名無しさん:2007/04/22(日) 13:40:36
>>2
kwsk
4デフォルトの名無しさん:2007/04/22(日) 13:45:32
むずむずしてきた
5デフォルトの名無しさん:2007/04/22(日) 13:51:39
_asm使えば、FORTRANどころかアセンブラ並みの速度で動くぞ?
6デフォルトの名無しさん:2007/04/22(日) 14:51:58
アセンブラ並で書いても、FORTRANには負けるぞ?
7デフォルトの名無しさん:2007/04/22(日) 16:08:16
FORTRAN のコードを逆アセして
その全てを直接埋め込んでやればいいんじゃね?
8デフォルトの名無しさん:2007/04/22(日) 18:21:12
っつーかFORTRANって単に古いPG言語だから
コンパイラメーカ側に最適化のノウハウが沢山あるってだけだろ?
9デフォルトの名無しさん:2007/04/22(日) 18:50:12
C も相当古くなってきた上に、C 以前の最適化技術を取り込める上に、最近の CPU は
C のプログラムを動かす事を前提にチューニングされているという話もある上に…
10デフォルトの名無しさん:2007/04/22(日) 19:06:21
>>8
ポインタの有無が最適化に大きく影響すると聞いた事があるよ。
あとは、並列化コンパイルのやりやすさとか。
11デフォルトの名無しさん:2007/04/22(日) 20:54:55
>>1
具体的な実行環境と、それぞれのコンパイラは?
前提条件すら明示せずに、何を考えようと言うんだ?
頭が悪いにも程がある。

条件設定を行わずにいきなりこの手の話で喚き始める
他の奴らも無能の境地を極めてるな。
12デフォルトの名無しさん:2007/04/22(日) 21:20:31
まぁそんなムキになんなよ。こんな2chのスレで。バカっぽいからさ。
13デフォルトの名無しさん:2007/04/22(日) 21:30:13
火病の前提条件厨はスルー

>>10
あと、90以前のFORTRANは、変数が全てヒープ領域に置かれている点も特徴的だった。
今考えると、それ単体ではさほど速度的に有利になるとは思えないのだけど
データフロー解析がやりやすくなるとか、何かしらメリットがあったような気がする。
14デフォルトの名無しさん:2007/04/22(日) 21:45:38
具体的な話をしなければ、適当なことをいっても誤魔化せるという利点は重要だよ。
15デフォルトの名無しさん:2007/04/22(日) 21:52:07
>>12
バカっぽいというよりは、単なる異常者(東京在住44歳)
1611=14:2007/04/22(日) 22:04:28
みんなごめんね☆

何か寂しくなっちゃって全然関係ないこと書き込みしちゃいました。

反省したので明日ボウズにしてきます。

(;_;)
17デフォルトの名無しさん:2007/04/22(日) 22:12:03
結局オナニースレだからな。
自分の言いたいことを言ってりゃいいんだよ。
裏付けなんて必要ないし、ソースもいらない。
1811=14=17:2007/04/22(日) 22:17:35
みんな本当にごめんね☆

何か寂しくなっちゃってまたまた全然関係ないこと書き込みしちゃいました。

反省したので一週間オナニーがまんします。

(;_;)
19デフォルトの名無しさん:2007/04/22(日) 22:18:55
カプサイシンは面白いな
煽ったり謝ったり、また煽ったり謝ったり
もしかして精神状態不安定か(ワロス
20デフォルトの名無しさん:2007/04/22(日) 22:26:57
お前もカプサイシン取れば、少しは痩せるかもしれないよ?デブ。
21デフォルトの名無しさん:2007/04/22(日) 22:34:28
見事な糞スレ
22デフォルトの名無しさん:2007/04/23(月) 04:01:29
http://www.oonumerics.org/blitz/
これとか見ると、FORTRAN並のスピードを出すには、相当のチューニングが必要みたいだね
23デフォルトの名無しさん:2007/04/23(月) 08:05:33
必要なところだけFORTRANで書いてリンクすればええやん。
24デフォルトの名無しさん:2007/04/23(月) 08:39:29
ちなみにウチの学科は今期の授業ではFortranを学びます。敢えてFortranなんて始める聞くのを修得する必要ってあるんでしょうか? 
ぶっちゃけこれはウチの先生が異常なんすよね…?
25デフォルトの名無しさん:2007/04/23(月) 08:45:34
情報系でやってるのなら異常
他なら普通
26デフォルトの名無しさん:2007/04/23(月) 08:51:49
情報系の学生ならFortranくらい「知ってて当然」だけどな
今からFortranで新たに何か作るのは正直お勧めしないが,
過去にジジイ達が書いてきたライブラリはそれなりにいい感じに枯れてるから
利用価値はあるわな
27デフォルトの名無しさん:2007/04/23(月) 09:37:28
まあ、COBOL書いてるジジィどもに比べて、
FORTRAN書いてるジジィどもは圧倒的に社会的地位が上だけどな。
28デフォルトの名無しさん:2007/04/24(火) 12:53:17
>>17
だったらマ板にでも逝けよ。
29デフォルトの名無しさん:2007/04/24(火) 19:44:08
何だ、FORTRANてそんなに速いのか。
アセンブリとCの次にC++が速いのかと思ってた。
30デフォルトの名無しさん:2007/04/24(火) 19:56:17
書きようによってどうにでもなるのがC++。

しかし、Cと同等の速度にまで上げられるC++が
FORTRANに勝てない状況が想像できない。
ベクトル化技術くらいじゃね?C++が劣ってるの。
31デフォルトの名無しさん:2007/04/24(火) 20:36:17
なんだ負け犬がここでも暴れてるのか
32デフォルトの名無しさん:2007/04/25(水) 01:30:47
C++ は C と同等の速度にはならねえ。ランタイムライブラリの差でどうしても無理。
33デフォルトの名無しさん:2007/04/25(水) 01:45:56
>>32
C++のランタイムライブラリってどうせ糞だから、
C++のライブラリは使わないようにして
Cのランタイムライブラリをリンクをすればおk
34デフォルトの名無しさん:2007/04/25(水) 20:28:10
CやC++でポインタを使うとコンパイラの最適化がきかなくなるし。

C++で演算子のオーバーロード使って行列演算なんかおこなうと
データコピーのしまくりで絶望的に遅くなる。

Fortranの数値計算ライブラリは枯れていて信頼性があるし、
アルゴリズムで対応できる限界まで高速に作られている。

自分も今ではFortranではなくC++を使っているが、残念ながら
実感としてFortranの実行速度の方がかなり速いと思う。

Fortranに匹敵する実行速度をC++で出すにはかなり難しい。
C言語的な使い方をするならそこそこ速いだろうけど。
35デフォルトの名無しさん:2007/04/25(水) 21:10:28
>>34
Fortranにかなうかどうかはともかく、C++で無駄なコピーを減らすための
式テンプレート (Expression Template)は有名。
自分で実装するのは面倒だが。
36デフォルトの名無しさん:2007/04/25(水) 23:32:45
でも、数式テンプレートは行列の乗算とかになると、複雑で呪文みたいな
コードになるでしょ。

それにサイズ固定だし、行列のサイズが1000×1000になるとコンパイル時間
が。。。

そもそも、コンパイラがテンプレート機能に完全に対応できてなくて、コン
パイルできないという事態も。。。
37デフォルトの名無しさん:2007/04/26(木) 11:32:16
>>34
>データコピーのしまくりで絶望的に遅くなる。
作りがヘタクソだから、としか思えないんだが。つかオーバーロード関係ないし。
38デフォルトの名無しさん:2007/04/26(木) 11:35:46
C言語でポインタを2つ以上関数に渡すと、それらが指すアドレスの
範囲が重なるものと見なされて最適化の妨げになる。(エイリアス問題。
最近のキャッシュを積んだCPUでコヒーレンシの問題になる)

そのためC99や一部のCコンパイラではrestrict修飾子をつけて、それら
のポインタの範囲が重ならないとコンパイラに知らせる事ができ、この
機能を使って書いた演算ライブラリはFORTRAN並みまでは行かないと
しても従来のCよりは早く動作すると期待できる。
39デフォルトの名無しさん:2007/04/26(木) 11:38:23
http://seclan.dll.jp/c99d/c99d07.htm

上の例はここら辺。
40デフォルトの名無しさん:2007/04/26(木) 14:30:56
>>37

何いってんのさ。
行列の乗算に*を使う限り、関係するよ。

お前が

C=prod(A,B)しか連想できないからだ。

よくわかりもしないくせに書くな。馬鹿が
41デフォルトの名無しさん:2007/04/26(木) 14:36:03
つうか、何の速度なんだ?
42デフォルトの名無しさん:2007/04/26(木) 14:38:31
もういい。よく読んでないな。馬鹿はほっとこ
43デフォルトの名無しさん:2007/04/26(木) 14:47:05
戻り値構造体/クラス最適化くらいは知ってるよな?

#include <iostream>
using namespace std;

class A {
public:
A() { cout << "A()" << endl; }
A(const A&) { cout << "A(): copy" << endl; }
A(const char* name) { cout << "A(" << name << ")" << endl; }
A operator*(const A&) { A a("*"); return a; }
};

int main() {
A a("a"), b("b");
A c = a * b;
}

結果
A(a)
A(b)
A(*)
44デフォルトの名無しさん:2007/04/26(木) 14:56:03
戻り値最適化ぐらいわかってるわい。
つまらんコードをダラダラ書くな
45デフォルトの名無しさん:2007/04/26(木) 14:56:52
大事なコレ入れるの忘れてた。
結果は同じだけど。

const A& operator=(const A&) { cout << "=" << endl; return *this; }
46デフォルトの名無しさん:2007/04/26(木) 14:58:00
お前は誰だ?
47デフォルトの名無しさん:2007/04/26(木) 15:52:27
↑匿名掲示板でバカな質問だと思った
いつも馴れ合ってるから見ず知らずの相手に弱いんだなw
48デフォルトの名無しさん:2007/04/26(木) 15:55:20
なんという遅レス・・・
49デフォルトの名無しさん:2007/04/26(木) 16:52:14
>>43
初期化シーケンスの一部ならそうだろうが、式の一部で使われたらどのみち
一時オブジェクトのコンストラクタと最終結果の operator=() 呼び出しは避けられんね。
まあ、そもそも operator*() 定義するならその前に operator*=() 定義すべきなんだが。
50デフォルトの名無しさん:2007/04/26(木) 16:56:15
行列の *= の処理は最低でも作業用のベクトルが必要になるから微妙。
関数にした方がいい。
51デフォルトの名無しさん:2007/04/26(木) 17:20:43
結局全部関数にすれば解決。
オーバーロードはあくまで可読性向上のためのものであって、
処理効率向上のためのものじゃない。
52デフォルトの名無しさん:2007/04/26(木) 17:21:31
×オーバーロードは
○演算子オーバーロードは

略しすぎた。
53デフォルトの名無しさん:2007/04/26(木) 19:14:24
C++コンパイラを使うだけでいいのか、
C++でオブジェクト指向プログラミングしてのことかわからんが、

前者ならそこそこの速度ものが作れんじぇね。
後者ならどう考えても無理だろ。
54デフォルトの名無しさん:2007/04/30(月) 19:47:25
>>53
C++と言っている時点でオブジェクト指向プログラミングでの話でしょ。

55デフォルトの名無しさん:2007/04/30(月) 21:27:30
C++はC言語のほかに、
動的型システム(仮想関数)を含むオブジェク指向、
テンプレート機構によるジェネリック・プログラミング
等々を取り入れたマルチパラダイム言語ですが、何か?
56デフォルトの名無しさん:2007/04/30(月) 21:38:05
演算子オーバーロードを使わなくても
オブジェクト指向プログラミングは
オブジェクト指向プログラミングだろ。
57デフォルトの名無しさん:2007/04/30(月) 22:02:58
まあ、演算子のオーバーロードならFortranにもあるしな。
58デフォルトの名無しさん:2007/04/30(月) 22:11:14
なんだ繰言繰り返しているだけか
59デフォルトの名無しさん:2007/04/30(月) 22:36:13
55は実際プログラムを組んだことがない希ガス
60デフォルトの名無しさん:2007/04/30(月) 22:51:56
>>59は現実認識が曖昧になった統合失調症患者
61デフォルトの名無しさん:2007/05/01(火) 00:28:09
仮想化とは対象物を不完全ながらもその性質や姿を模倣し現出させることだ。
対して抽象化は、対象物のある特徴的な側面を抽出し概念化することだ。
仮想化で抽象化の技術が使われることはあるだろうが、その逆は考え難い。
コンピュータを使い、扇風機やコタツを抽象化することはできても、仮想化する
ことはできないのだ。少なくとも今の技術では無理だ。コンピュータがその姿形
を変えることはできないのだから。コンピュータが仮想化できるものは、コンピュー
タそのものが直接扱うものだけだ。例えば、仮想メモリ、仮想ネットワーク、仮想
マシン、仮想キーボードといったものだ。

抽象化した結果表現されるものは、設計者が想定した概念やイメージだ。しかし、
実在するものそのものではなく、人が考えたものであるために、このイメージは
非常に脆く、不安定だ。外部からの影響をもろに受け、形を変え易い。個々人が
持つイメージの些細な相違から認識のずれが生じ易い。扇風機の使い方は人に
よって異なることはないが、人がイメージしたものは、その生成から、破棄に至る
まで、非常に不安定な状態になり易い。それを防ぐには、イメージそのものをなる
べく強固なものにし、インターフェースに一貫性と整合性をもたせ、外因による影響
を受けに難くく、壊れ難くするための技術を見につけ、理解を深めておくしかない。
62デフォルトの名無しさん:2007/05/01(火) 13:19:01
いつのまにか実行速度関係なくなってんな。
速度で勝ち目がなさそうなC++厨がC++がいかにすばらしいかを語るってか。
63デフォルトの名無しさん:2007/05/01(火) 14:15:38
>>61

何が言いたいんだ?
一方的にダラダラと書き込みやがって 馬鹿か
64デフォルトの名無しさん:2007/05/01(火) 14:58:39
>>63
おちつけ
ただのマルチのコピペにマジ切れするな
65デフォルトの名無しさん:2007/05/01(火) 21:43:08
>>55
「・・・マルチパラダイム言語ですが、何か?」
って、それと実行速度関係あんのか?
66デフォルトの名無しさん:2007/05/02(水) 09:49:20
FORTRANの速度のこと調べてたら
「ベクトル化」って言葉が出てきたけど
イマイチよく分からん。誰か説明plzzzzzzzzzzzz
67デフォルトの名無しさん:2007/05/02(水) 11:49:23
68デフォルトの名無しさん:2007/05/02(水) 13:04:19
んーと…多CPUのスパコンがあったとしたら
Cで言えば

for(i=0; i<size; i++) {
  ary1[i] = ary2[i] * 2;
}

って書いたら

CPU0で ary1[0] = ary2[0] * 2;
CPU1で ary1[1] = ary2[1] * 2;

みたいにコンパイラ側で展開してくれるってこと?
69デフォルトの名無しさん:2007/05/02(水) 13:05:11
ふと思った。
もしかしてPS3のコアってFORTRANと相性が良いのか…
70デフォルトの名無しさん:2007/05/02(水) 15:27:22
>>68
多 CPU や多コアの場合はベクトル化といわずに並列化と言う。
ベクトル化した場合は、CPU の一命令で複数の計算を同時に行う。
71デフォルトの名無しさん:2007/05/03(木) 02:41:46
どうしてベクトル化にはFORTRANが向いているの?
72・∀・)っ-○◎●:2007/05/03(木) 03:20:24
ポインタがなく、ベクトル化しやすい配列という概念で抽象化されてるから
73デフォルトの名無しさん:2007/05/03(木) 11:20:14
integer, pointer :: p => null()
integer, target :: n = 1
p => n
print *, p
n = 2
print *, p
74デフォルトの名無しさん:2007/05/03(木) 13:57:01
配列の受け渡しにポインタを使わないという事だと思うぜ。
75デフォルトの名無しさん:2007/05/06(日) 00:14:29
VC.net 2003 Visual C++で戻値最適化を期待して名前無し
コンストラクタをreturnしたんだが、コピーコンストラクタ
が呼ばれまくってた。

A*B*Cなどのような連続演算では最適化を期待する
こと自体が無理かな。やっぱり関数呼び出しで1回
ずつ処理するしかないか。
76デフォルトの名無しさん:2007/05/06(日) 00:16:40
戻り値最適化は別に return でコンストラクトしなくても良かったと思うけど。
77デフォルトの名無しさん:2007/05/06(日) 09:12:03
数値計算はやっぱり小手先のテクニックよりアルゴリズムだからね。

抽象化の度合いが適切だと最適化し易いから
コンパイラの最適化を必死でやってる人と、
末端で頑張るプログラマでは、やっぱり、そりゃ採用出来るアルゴリズムに差が出てしまうでしょ。
78デフォルトの名無しさん:2007/05/06(日) 11:36:50
そりゃ、アルゴリズムが重要だということはわかってるけど、
小手先の実装技術が大きくものをいう場合もあるわけよ。

1000×1000の行列演算なんかちょっとしたテクニックで計算
時間が1/3以下になることだってざらだし。

ま、実装技術に凝りすぎると泥沼の世界にはまるのは確か
なんだけど。
79デフォルトの名無しさん:2007/05/06(日) 11:49:07
行列積って、
畳み込みをFFTでやると何桁も改善出来るような、そういう高速アルゴリズムは無いの?
80デフォルトの名無しさん:2007/05/06(日) 14:37:20
おまいはいつもその例しか出さないな。それしか知らんのか、と。
81デフォルトの名無しさん:2007/05/06(日) 20:42:45
↑もっとも簡単でポピュラーな例だからさ。
それよりおまいはその程度のレスしかできんのか、と。バーカw
82デフォルトの名無しさん:2007/05/06(日) 20:44:12
キャッシュヒット率を上げるようなアルゴリズムはあったと思うけど。
83デフォルトの名無しさん:2007/05/06(日) 22:09:50
>>81
お前は俺が教えた話を二ヶ月も引っ張るバカだという事を再確認した。
84デフォルトの名無しさん:2007/05/06(日) 22:12:45
ここにはバカしか居ないからしようがない。
85デフォルトの名無しさん:2007/05/06(日) 23:01:22
>>83

はいはい、と
86デフォルトの名無しさん:2007/05/07(月) 06:20:10
タイトルと話題の乖離がひどいと思った。
87デフォルトの名無しさん:2007/05/07(月) 12:21:26
>>86
「PGを組む」って辺りでもう駄目だと思ってたが。
88デフォルトの名無しさん:2007/05/07(月) 13:01:56
ですよね
最初マかと思った
89デフォルトの名無しさん:2007/05/20(日) 08:01:49
double a;

a=0;
としたばあい、
a=0.0;
よりもキャストの分だけ遅くなる可能性はありますか?
90デフォルトの名無しさん:2007/05/20(日) 09:46:08
可能性がある処にはいつだって可能性はある。

ただ、今の多くの実装では定数はあらかじめ処理される。
91デフォルトの名無しさん:2007/05/20(日) 17:34:48
>>89
それで遅くなるように実装する方がめんどくさい罠。
92デフォルトの名無しさん:2007/05/28(月) 19:56:30
>>91
そうでもあんめー
93デフォルトの名無しさん:2007/06/04(月) 01:39:49
多次元配列使うとやっぱ速度落ちるかな?
1次元を複数用意したほうがいいのかな?
94デフォルトの名無しさん:2007/06/04(月) 01:54:13
Cに多次元配列などない!
9593:2007/06/04(月) 02:08:20
fortranスレと間違えました。失礼しますた
c++も同じでしたっけ?
96デフォルトの名無しさん:2007/06/04(月) 04:43:09
>>94
規格票にも普通に多次元配列とか書いてるんだけど・・・。
97デフォルトの名無しさん:2007/06/04(月) 04:44:19
>>95
・ 何をやりたいのかが分からない
・ 何と比べたいのかが分からない
98デフォルトの名無しさん:2007/06/04(月) 08:09:56
>>96
それは配列の配列を便宜的にそう呼んでいるだけだ。
99デフォルトの名無しさん:2007/06/04(月) 08:30:44
>>98
自分の中の定義とか、C 以外における定義を
勝手に押しつけてるだけだよ、それは。
C では配列の配列 = 多次元配列だと規格票で認めてるんだから、
C においてはその定義を受け入れるべき。
100デフォルトの名無しさん:2007/06/04(月) 17:06:00
分岐を分岐でないものに変換するテクニックとしてはどんなものがありますか?
101デフォルトの名無しさん:2007/06/04(月) 17:07:45
スレ違い
102デフォルトの名無しさん:2007/06/05(火) 02:22:28
配列の配列と多次元配列は別物だろ。
Cの多次元配列は多次元配列
103デフォルトの名無しさん:2007/06/05(火) 03:27:06
6.5.2.1 配列の添字付け
・・・
連続した添字演算子は,多次元配列の要素を指し示す。Eが次元i×j×...×kをもつn次元配列(n≧2)
である場合,E(左辺値以外として用いた場合。)は,次元j×...×kをもつ(n-1)次元配列へのポインタ
に型変換する。
・・・
  例 次の宣言で定義された配列オブジェクトを考える。
   int x[3][5];
  ここでxは,intの3×5の配列である。より正確には,xは三つの要素オブジェクトの配列であ
  り,その各要素は,五つのintの配列である。
・・・
104デフォルトの名無しさん:2007/06/05(火) 04:56:41
>より正確には,xは三つの要素オブジェクトの配列であり,その各要素は,五つのintの配列である。
どう読んでも配列の配列です。
105デフォルトの名無しさん:2007/06/05(火) 20:36:15
>>104

>>99
>C では配列の配列 = 多次元配列だと規格票で認めてるんだから、
>C においてはその定義を受け入れるべき。

99の言うとおりでいいんじゃないの?
106デフォルトの名無しさん:2007/06/09(土) 19:38:58
配列の配列ってのはargvみたいなことを言うんだよ
107デフォルトの名無しさん:2007/06/09(土) 20:09:03
argvはポインタの配列だろ?
108デフォルトの名無しさん:2007/06/09(土) 23:10:58
C言語はポインタと配列を意図的にごっちゃにしてる部分があるから鬱陶しいな
109デフォルトの名無しさん:2007/06/09(土) 23:28:35
C言語の本質は上級アセンブラ。その直系派生言語であるC++も右に同じ。
あれ? 現代文章の場合左って書かないといけないんだっけ?
どうみても右じゃなくて左だもんなぁ。
110105:2007/06/09(土) 23:29:56
>>107
そのポインタはcharの配列へのポインタですよね?

argvは配列の配列とは違うのですか?
111デフォルトの名無しさん:2007/06/09(土) 23:31:34
>>110
>そのポインタはcharの配列へのポインタですよね?

そうだよ。

>argvは配列の配列とは違うのですか?

うん、違う。
112デフォルトの名無しさん:2007/06/09(土) 23:58:26
>>110
int a[3][3] = {
 { 1, 2, 3 },
 { 4, 5, 6 },
 { 7, 8, 9 }
};



int a0[3] = { 1, 2, 3 };
int a1[3] = { 4, 5, 6 };
int a2[3] = { 7, 8, 9 };
int *a[3] = { a0, a1, a2 };

がメモリ上でどうなってるか考えてみれ。
113105:2007/06/10(日) 00:29:55
>>112
int a[3][3] → 配列の配列(メモリ上でintが3つ並んでいるものが3つ並んでる)
int *a[3]  → ポインタの配列(メモリ上でintへのポインタが3つ並んでる)

このように考えると良いでしょうか?
114デフォルトの名無しさん:2007/06/10(日) 01:22:57
そういうこと。
115105:2007/06/10(日) 09:04:51
さらに、もし

int a0[3] = { 1, 2, 3 };
int a1[3] = { 4, 5, 6 };
int a2[3] = { 7, 8, 9 };
int (*a[3])[3] = { &a0, &a1, &a2 };

だったら

int (*a[3])[3] → 配列へのポインタの配列

ということですよねぇ。ややこしいなぁ。
116105:2007/06/10(日) 09:41:38
ちょっと調べたのですが
仮引数で配列を宣言するとポインタになるそうです。

ということは、argvは正確には
ポインタの配列ではなくて
ポインタのポインタですよね?
117デフォルトの名無しさん:2007/06/10(日) 11:17:03
そうだよ。
118105:2007/06/10(日) 12:56:14
結局、C言語の多次元配列はどういうことなのでしょうか?

C言語が持っている機能は 配列の配列 なのに
C言語の規格では、なぜか
配列の配列 = 多次元配列 ということになっている。

というような感じですか?
119デフォルトの名無しさん:2007/06/10(日) 13:27:20
なぜか、って、何でだ?
C だと「配列の配列 = 多次元配列」だ、という、ただそれだけの話。
120105:2007/06/10(日) 14:03:24
>>119

>>99
>C では配列の配列 = 多次元配列だと規格票で認めてるんだから、
>C においてはその定義を受け入れるべき。

じゃぁ、やっぱり99の言うとおりでいいってことですよねぇ・・・。
121デフォルトの名無しさん:2007/06/10(日) 14:18:46
>>120
基本的にはそうなんだが、Cの「多次元配列」が色々と不便なのでそういう話も
出てくるんだろ。
N×Mの2次元配列(N, Mは任意)を扱う関数を作りたい、といった
ニーズは普通にある訳だが、Cの多次元配列の仕様だと困ることになるので、
1次元配列を代わりに用いたり、特殊なメモリ割付をしたり、といったことが
必要になる。
122デフォルトの名無しさん:2007/06/10(日) 14:20:09
多次元配列と、配列の配列の認識が逆だ>>111, 112

123105:2007/06/10(日) 15:13:11
>>122
えっ?よく分かりません。

>>110の質問に対するレスが>>111>>112なのですが
その中におかしいところがあるのですか?
124デフォルトの名無しさん:2007/06/10(日) 15:32:10
>>122 がおかしいだけだと思うぜ。
125デフォルトの名無しさん:2007/06/10(日) 16:58:22
gccでメモリからのプリフェッチをコントロールする方法はありませんか?
126デフォルトの名無しさん:2007/06/10(日) 20:32:50
gcc自身にそういう機能があるかどうかは知りませんが、
ソース中にそういう処理を埋め込むことはできます。
127デフォルトの名無しさん:2007/07/06(金) 17:26:00
つ __builtin_prefetch
128デフォルトの名無しさん:2007/07/06(金) 22:17:23
配列
a[0], a[1], a[2], a[3], a[4], a[5]
b[0], b[1], b[2]
c[0], c[1], c[2], c[3], c[4]

配列の配列
d[0]=a
d[1]=b
d[2]=c


多次元配列
a[0][0], a[0][1], a[0][2]
a[1][0], a[1][1], a[1][2]
a[2][0], a[2][1], a[2][2]

129105:2007/07/07(土) 17:59:17
>>128
>配列の配列
>d[0]=a
>d[1]=b
>d[2]=c

これは「配列の配列」ではなくて「ポインタの配列」だと思うのですが。
130デフォルトの名無しさん:2007/09/24(月) 07:41:22
AMDの仕様に書いてあるのですが、ポインタではなく[xx]でアクセスしたほうが最適化されやすいのはなぜですか?
131デフォルトの名無しさん:2007/09/24(月) 10:56:00
>>130
今のコンパイラにとって、違いがあるとは思えないのだが。
敢えて考えれば、ループ構造まで含めて考えたときにループアンロールやベクタ化しやすいとは言える。
132デフォルトの名無しさん:2007/09/24(月) 21:13:58
いやあるだろ
ポインタ解析では完全な解析は不可能
133デフォルトの名無しさん:2007/10/12(金) 17:09:47
最適化に聴くという参照渡しって何ですか?
134デフォルトの名無しさん:2007/10/12(金) 17:17:36
最適化に聴いても何も答えてくれない。
135デフォルトの名無しさん:2007/10/12(金) 17:20:41
>>133
つ[Google]
136デフォルトの名無しさん:2007/10/16(火) 09:24:42
配列を0で初期化したいのですが、ループでまわすよりも高速な方法はありませんか?
137デフォルトの名無しさん:2007/10/16(火) 09:45:14
>>136
memsetは?
138デフォルトの名無しさん:2007/10/16(火) 11:08:35
>>136
適当なコンパイラを使えばループで回すだけでも充分速いコードを出力するのだが、
コンパイラオプションなどは適切に設定しているのか?
139デフォルトの名無しさん:2007/10/16(火) 19:19:48
動的に多次元配列を作ってみればわかるべ
140デフォルトの名無しさん:2007/10/16(火) 21:44:44
>>136
calloc
メモリを0クリアと胡散臭いことになるが、一応doubleでも0.0として利用可能
141デフォルトの名無しさん:2007/10/22(月) 16:37:25
double a=10;
if (xx>10)a=20;
というコードは
double a;
if (xx>10)a=20;
else a=10;
というコードよりも速い?
142デフォルトの名無しさん:2007/10/22(月) 16:52:58
>>141
恐らくは、最適化によって同じコードになります。そうでなかったとしても、問題になるほどの差は出ません。
安心して、他の問題点を探してください。
143デフォルトの名無しさん:2007/11/28(水) 22:07:12
時系列データからLyapunove expornentを推計するとBorland C++5.5とg95で約3倍は時間が違うのですが。どうすればよいですか。
144デフォルトの名無しさん:2007/12/27(木) 21:59:54
黄金分割探索法
145デフォルトの名無しさん:2008/02/07(木) 14:09:16
volatileを使った最適化って具体的にはどーゆーの?
146デフォルトの名無しさん:2008/02/08(金) 11:06:14
>"volatileを使った最適化" に一致するページは見つかりませんでした。
147デフォルトの名無しさん:2008/02/08(金) 19:17:49
volatile はむしろ最適化を阻害するために使うのだが。
148デフォルトの名無しさん:2008/03/01(土) 12:40:27
Cで2次元配列は使わない方がいいの?
149デフォルトの名無しさん:2008/03/01(土) 13:21:05
>>148
cには二次元配列というものが実はないので、(1次元)配列のオフセットを計算する形で実装する方が素直に扱えます。
# 例えばcの文脈上、array[x][y]とあってもそれが配列の配列なのか配列のポインタ配列なのか区別つきませんし。
150デフォルトの名無しさん:2008/03/01(土) 13:29:31
は?
151デフォルトの名無しさん:2008/03/01(土) 13:37:59
> # 例えばcの文脈上、array[x][y]とあってもそれが配列の配列なのか配列のポインタ配列なのか区別つきませんし。

だうと。次の(A)と(B)を比べてみよ

(A)
int array[][3] = {{0, 1, 2}, {3, 4, 5}};

(B)
int a_0[] = {0, 1, 2};
int a_1[] = {3, 4, 5};
int *array[] = {a_0, a_1};
152デフォルトの名無しさん:2008/03/01(土) 13:42:55
何がダウトなんだろう。
Aの宣言の後にarray[0][0]と書いてある場合と、
Bの宣言の後にarray[0][0]と書いてある場合を較べると、
どちらも値0なことは判るが区別はつかないんだけど。
153デフォルトの名無しさん:2008/03/01(土) 14:28:45
int foo(int array[][3]) {
 return array[1][1];
}

int bar(int *array[]) {
 return array[1][1];
}

アセンブラ出力を見てみそ
154デフォルトの名無しさん:2008/03/01(土) 14:35:15
複数のポインタを配列で扱う場合に物理的にばらばらの位置にあるって話じゃない?
155デフォルトの名無しさん:2008/03/01(土) 14:41:00
なんだか必死すぎて却って笑えないな。
「文脈上」区別できないと言っているのになんでそこまでして区別できると認めさせようとするのさ。
処で、>153の前者は固定長配列だから不便だし、後者は後者で一回余計なメモリアクセスが入るので
パフォーマンスが落ちるし、擬似二次元アクセスの方がいいという点は理解できているのかな?
156デフォルトの名無しさん:2008/03/01(土) 14:46:22
アクセス回数よりもキャッシュラインが重要ってじっちゃんが言ってた
157デフォルトの名無しさん:2008/03/01(土) 19:49:04
規格に多次元配列って書いてあるけどこれは如何に。
158デフォルトの名無しさん:2008/03/01(土) 20:36:58
>>157
便宜上多次元配列と呼ばれているものは、その実態は配列の配列として実装されているんだから
他の言語にあるような多次元配列とは違うのよ。
159デフォルトの名無しさん:2008/03/01(土) 21:07:40
>>158
他の言語にある多次元配列と違うことは別に重要じゃないだろ。
160デフォルトの名無しさん:2008/03/01(土) 21:23:49
>>159
では、>149は理解できましたか?
161デフォルトの名無しさん:2008/03/01(土) 21:44:02
「文脈上」をどういう意味で使ってるんだ?
内容からは「そこだけ見ると」という意味だとしか思えないが
だとすれば日本語としておかしいぞ
162デフォルトの名無しさん:2008/03/01(土) 21:55:42
>>151 違う
>>149 が書いてるのは、その例で言うと
int array[2][3]; に対する array[1][1] と
int (*array)[3]; に対する array[1][1] が
同じものだ、ということだ。アセンブリ出力で確認してみろ。
あと「配列へのポインタ」でググる。
163デフォルトの名無しさん:2008/03/01(土) 21:57:21
>>149 は見た目から区別できないって言ってるだけだろ?
164デフォルトの名無しさん:2008/03/02(日) 10:33:28
>>148
> Cで2次元配列は使わない方がいいの?

スレタイに沿って答えるなら、
限界まで性能を叩き出すためなら、1次元に展開したほうが
うまいコードを書ける場合もある。

普通のコードなら普通に書いておいて、機械的なやって当たり前の
最適化はコンパイラに任せればいい。
165デフォルトの名無しさん:2008/03/02(日) 11:00:09
>>160
>cには二次元配列というものが実はないので
だからあるっていってるだろ。
C では 二次元配列=配列の配列 と定義されてるだけであって。
166デフォルトの名無しさん:2008/03/02(日) 12:07:21
んじゃ、多言語のようなまともな二次元配列ではない、
紛い物の二次元配列しかないと言い換えようw
167デフォルトの名無しさん:2008/03/02(日) 12:28:57
多言語?
168デフォルトの名無しさん:2008/03/02(日) 12:30:22
凄い嬉しそうな顔をして書き込んでいるのが目に浮かぶようだ。
169デフォルトの名無しさん:2008/03/02(日) 15:26:27
言語論はスレ違い
170デフォルトの名無しさん:2008/03/02(日) 16:34:58
int a[ raw * col ];
return a[ x * col + y ];

要はこうしろと。
・・・別に、これで不便はないね。
171デフォルトの名無しさん:2008/03/02(日) 16:38:23
boost::multi_array 使えば?
172デフォルトの名無しさん:2008/03/02(日) 16:40:13
最初以外の添字のサイズが動的に決まる多次元配列は
一次元配列を使って実装するしかない。
C++ ならクラスを使ってごまかせるし、
C でもインデックスを計算する関数かマクロでも用意しておけばいい。
173デフォルトの名無しさん:2008/03/02(日) 16:45:37
テレ東見ろ
174デフォルトの名無しさん:2008/03/02(日) 18:27:04
(n次元の)矩形にならないデータ構造は、
「配列」とは別の何かだろ。

「配列の配列」とか。
175デフォルトの名無しさん:2008/03/02(日) 18:31:45
日本語で頼む。
176デフォルトの名無しさん:2008/03/03(月) 01:11:03
>>170
コンパイラの最適化阻害要因になるけどな。
177デフォルトの名無しさん:2008/03/03(月) 02:48:08
C++ならvector<vector> で何とかならないかな
効率は落ちるかもしれんけど柔軟性は増す
178デフォルトの名無しさん:2008/03/03(月) 07:16:36
初期化が面倒だな。
boost::multi_array 使った方がいい。
179デフォルトの名無しさん:2008/03/03(月) 08:08:42
>>176
> コンパイラの最適化阻害要因になるけどな。

それを理解できず、昔の最適化がトロいコンパイラの頃の知識のまま、
一次元に展開したほうがよいと言う、馬鹿の一つ覚え野郎がいて困る。
180デフォルトの名無しさん:2008/03/03(月) 10:43:21
>>176
kwsk.

>>179
代案を頼む。

配列のポインタ配列になっているプログラムを、所謂仮想二次元にしたらずっと速くなったって
実績があるのだけれど、偶偶だったのかなぁ。
181デフォルトの名無しさん:2008/03/03(月) 14:47:10
>>180
最適化が効けが、一次元配列の方が速いにきまってる。
ポインタのポインタはメモリアクセスが2回あるからな。
i*col+j
は、col幅の2次元配列だと明示的にコンパイに伝わらないってのが問題。
2次元的な差分をとるために、(i+1)*col+jとかi*col+j+1とかも同時にアクセスする時に上手く最適化してくれなかったりする。
182180:2008/03/03(月) 14:53:59
おおう、"B"と"G"のtypoですな。

>>181
なるほど、隣接画素へのアクセスの問題ですね。私のところの仕事では、
そういうアクセスはないので問題にならなかったようです。情報THX。
183デフォルトの名無しさん:2008/03/03(月) 15:47:00
そもそもC/C++は明示的にコンパイラに意図したことが伝わりにくいから最適化は期待しにくい。

FORTRANのDOループに相当するものがない。
for(文1; 文2; 文3)
なんてのは、
文1; while(文2){ 文3;}
と全く等価で慣例的にカウンタの初期化、終了判定、カウントアップを置くにすぎないわけだし。
DO文はカウンタを使ったループだと明示的にわかる。
sin, cos等の数学関数もFORTRANではコマンドであるのに、C/C++はあくまで関数呼び出しであって、
本来コンパイラからはブラックボックス(最近は基本関数はコマンド同様に最適化するが)なので、
a[i] + sin(c)
なんてことをループ中でやると、
ポインタaがグローバル変数を差してるかもしれない
->sin(c)でa差す先の内容が変わるかもしれない
->ループ最適化中止
となる。
などなど。
FORTRAN並みの速さが欲しければFORTRANを使う方がよいかと。

184デフォルトの名無しさん:2008/03/03(月) 16:42:09
それを踏まえると、今のCコンパイラは頑張ってるねぇ。
whileで書くとベクタ化しないループもforで書けばベクタ化してくれるし、
ポインタに依存関係がないことをrestrict修飾子で支持すればそれを利用するし、
標準関数は超越関数に限らずどんどんインライン化してしまうし。
185デフォルトの名無しさん:2008/03/03(月) 16:49:28
gccでさえ__attribute__((pure))で副作用のない関数です、ってコンパイラに
教えてやればそれくらいは理解するしな。

noaliasはC++の標準ではどうなったんだっけ?
186デフォルトの名無しさん:2008/03/03(月) 19:24:04
sin は流石に組み込み化してるだろう。
普通のコンパイラなら。
187デフォルトの名無しさん:2008/03/03(月) 19:36:45
仕様としては決まってないけどね。
ベクトル化に関して言えば、
class A{
public:
 *a;
};

A foo;
for(i=0; i<1000;i++){
 foo.a[i] = foo.a[i]*2+b[i]*c[i];
}

みたいなのをベクトル化されなかったことがある。
foo.a[i]に代入する時点でオブジェクトfoo自体が更新されるので、ループ間に依存関係があると認識されていた。
メンバ関数にやらせればこんなことにはならないんだろうけど。
188デフォルトの名無しさん:2008/03/03(月) 23:47:33
しかし今でもCの二次元配列がポインタの配列だと思ってるヤツがいたとは
一回コンパイラが吐いたコード見てみろ
189デフォルトの名無しさん:2008/03/04(火) 01:43:33
>>188
藪から棒に何を言い出すのやら。誰がそんなこと言ってますかいな。
190デフォルトの名無しさん:2008/03/04(火) 08:42:30
いや、混同してた奴が議論に加わっていた数人の中に一人いるぞ。
191デフォルトの名無しさん:2008/06/08(日) 16:43:08
あげ
(禿しくガイシュツ内容は略。 数学の土俵で勝負だよね?)
波動関数は波と無関係な事を理解してなかった人の作w
勘違いを残した「歴史的」ネーミング、でも業績は不滅だ。
あえてFORTRANネイティヴな環境と勝負も生き方?
近似については日進月歩だから勝てる可能性も※。
「わかってない」も時にはいいかもしれないよ…。

※きっと後で対応されるけど、短い間ならもしかして?
画期的な成果が出た直後、または「新しい数学」の類。
楕円積分、複雑系、NP完全問題への新アプローチ?
数学は天文学より桁数が大きいから、可能性はある。
193初心者:2008/06/16(月) 19:21:06
二次元配列は確かに普通の配列より遅い
int a[255][255];
int i;
int j;
int count=0;

while(i<255){
while(j<255){
a[i][j]=count++;
}
i++;
}
とした場合と
int a[255*255];
int i;
int j;
int count=0;

while(i<255){
while(j<255){
a[i*255+j]=count++;

}
i++;
}
194初心者:2008/06/16(月) 19:30:15
>>193間違って書いた

二次元配列は確かに普通の配列より遅い
int a[255][255];
int i;
int j;
int count=0;

while(i<255){
while(j<255){
a[i][j]=count++;
j++;
}
i++;
}
とした場合と
int a[255*255];
int i;
int j;
int count=0;

while(i<255){
while(j<255){
a[i*255+j]=count++;
j++;
}
i++;
}
とした場合では3/4くらい処理速度に差が出る
ちなみにポインタを使うと1次元配列の2/3の処理時間ですむけど
アセンブラ的にも同じような操作なのになぜにこれほど佐が出るんですかね
195初心者:2008/06/16(月) 19:41:44
>>194また間違えた…
int i;→int i=0;
int j;→int j=0;
196デフォルトの名無しさん:2008/06/16(月) 21:06:36
icc使えばぁ
197デフォルトの名無しさん:2008/08/12(火) 20:53:45
double&&使うと、a*b*cみたいな行列演算の演算子オーバーロード
は本当に効率化できるのか?
198デフォルトの名無しさん:2008/08/13(水) 13:14:24
>>194
アセンブラコードで出力させれば、Cの2次元配列のしくみがわかるよ
と今頃言ってみる
199デフォルトの名無しさん:2008/08/14(木) 11:01:39
>>197
俺もそこに関心がある。

一時オブジェクトでも消滅前だったらconst参照はできるじゃなかったっけ?
例えばd=a*b*cの乗算の場合は、a*bの乗算結果を一時オブジェクト1に格納
しないと(a自身に格納したら)結果がおかしくなる。この一時オブジェクト1
とcの乗算結果をまた別の一時オブジェクト2に格納して一時オブジェクト2
が管理している動的配列のアドレスをdのポインタにコピーできればokだと
思うけどけど。しかし z=(a+b)*(x*c+d)みたいな演算は大丈夫だろうか?
200デフォルトの名無しさん:2008/08/14(木) 14:00:50
>>199
その例だったら、一時オブジェクト1とcの乗算の結果は、
一時オブジェクト1自身に格納しても問題ないはず。
それをdに代入するようにすれば、一時オブジェクト2は要らなくなる。

行列演算固有の話ではないけど右辺値参照による効率化はこんな感じのはず。
201デフォルトの名無しさん:2008/08/14(木) 17:46:08
■■みんなでサイトつくろうぜwwwwwwwwwwwwwwww■■
「お前ら一緒にサイト作ろうぜwwwwwwwwww」
「2ちゃん越えるサイト作ろうぜwwww」
「仕事無いんだ・・・・・・」
「やろうぜ!」
「みんなでサイトつくろうぜwwwwwwwwww」
http://gacco.o0o0.jp/
http://yutori.2ch.net/test/read.cgi/news4vip/1218673130/
http://ex14.vip2ch.com/test/read.cgi/part4vip/1218612197/
興味沸いたらきてください!
======================!! 人材募集中 !!======================
■プログラムを組んでくれる人
 *サーバー側
  言語はRubyかPerlの予定ですが、Perlが有力候補。
  ・チャット
   定期的にクライアントから着信があり、それに対して更新されたチャットのメッセージを返信する程度の能力。じゃなくて機能。
   通信するときのフォーマットは未定。
  ・ログイン・アカウント管理
   ログイン認証、各アカウントの点数などの管理。データベースは未定。
  ・お絵描き
   未定。とりあえず鯖に負担がかからない程度にたまに画像を送信してあげるって感じで
 *クライアント側
  はっきり言って俺もわからね。Ajaxだとかflashだとかjavaだとか。
■機能提案(正しくは人材ではなく、意見?)
 「こんな機能があったら良い!」「こうするともっと楽しくなる!」などの意見募集中。
 挨拶とか気にせずスレにどんどん書き込んでくれればおk
■デザイン
 サイトのデザインを考えてくれる人、作ってくれる人募集中。
 できればphotoshop illustrator使える人(プロジェクト共有しやすいので)
202デフォルトの名無しさん:2008/08/14(木) 23:41:24
>>199

>一時オブジェクト1とcの乗算の結果は、
>一時オブジェクト1自身に格納しても問題ないはず。

いいや、
演算結果は狂ってしまうと思う
203デフォルトの名無しさん:2008/08/15(金) 01:03:42
↑ごめん、>>200 の間違いでした。
やっぱり、だめだとおもうけどなぁ
204デフォルトの名無しさん:2008/09/19(金) 06:23:31
fortranて早いの?ねぇ
205デフォルトの名無しさん:2008/09/27(土) 16:42:30
大学でTSSって入力して使ってたような
206デフォルトの名無しさん:2008/09/27(土) 17:08:27
>>204
C/C++のポインタと配列にはエイリアスの問題があって最適化
が困難という事情があるのでFORTRANが有利

並列化(ベクトル化)のチューニングに対してもFORTRANの
方が枯れている

ただC99で restrict という予約語が正式になったからこれからは
どうなるかわからない

と言ってもCとFORTRANは行と列が逆、添え字の対応がCは
常に 0 から、とかいろいろ問題はあるけど
207デフォルトの名無しさん:2008/09/27(土) 18:35:41
>>206
最後の2行は速度と関係ないだろ

C++からサブルーチンとして呼ぶときに面倒だってだけで
208デフォルトの名無しさん:2008/09/27(土) 18:53:51
配列操作で行順と列順を間違えて遅くしちゃうとか
209デフォルトの名無しさん:2009/03/14(土) 04:04:32
はいはい
210デフォルトの名無しさん:2009/06/10(水) 19:22:12
ポインタには速度的なデメリットが出る時もあるんだな
211デフォルトの名無しさん:2009/06/20(土) 18:46:41
whileよりもforの方が最適化されやすいのですか?
212デフォルトの名無しさん:2009/06/22(月) 11:20:02
ポインターはエイリアスの問題があって最適化は無理っていう意味がわからんよ。
エイリアスはオブジェクトをメモリーに配置するときにアクセスを効率良く出来るように
アドレスをデータバスの境界に合わせましょうということでポインターと関係ないのでは?
213デフォルトの名無しさん:2009/06/22(月) 11:48:00
>>211
forに的を絞って最適化するケースもあるし、whileでは更新部が判り難くて最適化し難いこともある。
従って、forの方が最適化される可能性が高いとはいえると思う。
時として、do-whileの方が効率いいコードになることもあるが。
214デフォルトの名無しさん:2009/06/22(月) 11:52:51
>>212
どこのURLか失念したがうまくまとめてあるページがあったんだけどな

例えば簡単な例で説明するとポインタaとポインタbが同じアドレスを
指しているとする

ポインタaがメモリの内容を書き換える可能性があるので面倒でも
ポインタbはいちいちメモリから内容をロードしてやらなければならない

restrictを付けるとそういう考慮がされなくなって速くなるんだよ

ごめんうまく説明できないや
215デフォルトの名無しさん:2009/06/22(月) 11:56:52
>>212
俺は>>206ではないが、エイリアスの意味が違うと思うぞ。
同じアドレスを複数のポインタが指し得るから、最適化や自動並列化が
難しくなるという有名な問題のことを指しているんだと思う。
その点、Fortranのポインタは制限があるから最適化の邪魔になりにくい
ということだったはず。
216デフォルトの名無しさん:2009/06/22(月) 12:01:19
>>212
>アドレスをデータバスの境界に合わせましょうということで
>>215 の言う通り、お前はエイリアスを理解していない。
ttp://seclan.dll.jp/c99d/c99d07.htm#dt19991018
217デフォルトの名無しさん:2009/06/22(月) 12:07:05
MSDN見てみろや
__restrictの予約語の所に「エイリアス」と書いてあるから
218デフォルトの名無しさん:2009/06/22(月) 12:32:57
ポインタのエイリアス問題はわかるんだけど
それって参照にも当てはまるのかな?
参照って__restrict付けられないじゃない
これって、ポインタより参照の方が最適化
阻害されやすいのかな?

f( const A& a ); // こっちよりも
f( const A* __restrict a ); // こっちの方がいい?
219デフォルトの名無しさん:2009/06/22(月) 23:23:48
複数のポインターを使うとメモリーのコヒーレンシーを保てないから最適化が難しいという事は
解ったけど、でもそれはポインターと関係ないよ。
複数のスレッドから同一メモリーにアクセスするのが問題であってポインターを使わなくても
問題が発生するんじゃないの?
220デフォルトの名無しさん:2009/06/22(月) 23:37:36
スッドレ関係ねえ
221デフォルトの名無しさん:2009/06/22(月) 23:38:15
>>219
偉そうなことを言う割に馬鹿なこと言ってるな。
スレッドを使わなくても、コンパイラが最適化のためにコードの実行順序を
変更する時に問題が出るだろうが。そんな簡単なことも分からないか?
222デフォルトの名無しさん:2009/06/23(火) 09:28:10
>>221
ポインターを使って不具合がでるような実行順序の変更は、ポインターを使わないコードの
変更でもトラブルが出るだろ 馬鹿
223デフォルトの名無しさん:2009/06/23(火) 10:29:07
Cの2次元配列と、他言語の2次元配列ってどこがちがうの?
224デフォルトの名無しさん:2009/06/23(火) 10:36:52
>>222
顔を真っ赤にして捨て台詞吐く暇があったらさっさと実例出せよ
まさか配列とか言うなよ?Cではポインタの構文糖に過ぎないからな

お前本当に何も知らないんだな
225デフォルトの名無しさん:2009/06/23(火) 10:37:12
スレタイにFORTRANがあるのでFORTRANの話をすると、
CとFORTRANでは行と列(2次元の場合)が逆に、メモリ上に配置される。
226デフォルトの名無しさん:2009/06/23(火) 11:01:12
>>224って馬鹿なの?
fortranの配列のアクセスを変数を使って行なうのとcでポインターを使って行なうのが
同じだと気がつかないなんてマヌケだね
ひょっとしてニートなの?
227デフォルトの名無しさん:2009/06/23(火) 11:06:58
はぁ?Cのポインタエイリアスの話してんだろうが
気づいてないのはお前だろボケ
さっさと実例出せよ
228デフォルトの名無しさん:2009/06/23(火) 11:09:55
>>226
> ポインターを使わないコードの変更でもトラブルが出るだろ
おまいはさっさとこれを示せや
229デフォルトの名無しさん:2009/06/23(火) 11:10:17
>>224の無知ぶりは確かに痛いな。
自分が実例出せないもんだから相手に頼むなんて情けないよ。
そもそも最適化のために実行順序を変更するメリットを上げてみろよ。
それが出来ないようならお前の馬鹿が決定するよ。

ニートなんだから時間あるんだろ。じっくり考えろ ボケ!
230デフォルトの名無しさん:2009/06/23(火) 11:13:59
Cのポインタエイリアスって何の事?
まずはそこからの説明がいるな
きっちり説明してね ニート君
231デフォルトの名無しさん:2009/06/23(火) 11:18:58
>>229-230
すげえ高圧的にお願いしてるw
232デフォルトの名無しさん:2009/06/23(火) 11:26:40
だからVC9ででも__restrict付けてコンパイルした物と
付けないでコンパイルした物のどこが変わるか見るだけでも
結構勉強になるだろ
233デフォルトの名無しさん:2009/06/23(火) 11:28:08
>>229
お前が狂った主張をし始めたのだからその根拠を示すのは当然だ

> そもそも最適化のために実行順序を変更するメリットを上げてみろよ。
どこまで馬鹿なんだよ。おまえ計算機アーキテクチャを全然知らないだろ
パイプラインをストールさせたくないからに決まってるだろうが
こんな最適化の基本テクニックすら知らずに偉そうなこと言ってるのか?
234デフォルトの名無しさん:2009/06/23(火) 11:48:35
なんか荒れてるのが1人いるなぁ。
あんまり知ったかぶりの知識をさらけだしてると墓穴をほるよ。
ニートはニートらしくしといたほうがいいよ。
実行順序の変更はパイプラインのストールの為だけじゃなく複数のパイプラインを
効率良く使うためなんだがな。

じゃぁ本題に入るけどcでポインターを使うとエイリアスの問題で最適化できないのに
同じような処理をしてるにもかかわらずfortranの場合
配列を変数でアクセスしても最適化ができるのは何故?
配列を変数でアクセスというのはA(I),A(J),A(K)とかを使ってアクセスすることなんだけどね。
235デフォルトの名無しさん:2009/06/23(火) 12:03:23
お前はどれだけニート好きなんだ?
自分がそうだからって他までそうだと妄想するなよ

お前のような馬鹿のために単純化して言ってやっただけだから揚げ足取りするなよ

全然本題じゃないぞ。最初からそんな話はしてない。
Cのポインタエイリアスの話をしているんだろうが。

> ポインターを使って不具合がでるような実行順序の変更は、ポインターを使わないコードの
> 変更でもトラブルが出るだろ
これが本題だ。実例をさっさと挙げろよ
236デフォルトの名無しさん:2009/06/23(火) 12:12:39
>じゃぁ本題に入るけどcでポインターを使うとエイリアスの問題で最適化できないのに
>同じような処理をしてるにもかかわらずfortranの場合
>配列を変数でアクセスしても最適化ができるのは何故?
Cも配列の添字アクセスなら問題は出ない。
っていうか最低限MSDNの__restrictのページとか
読んでから来いよな。
237デフォルトの名無しさん:2009/06/23(火) 12:28:22
荒らしはageるもの
おまいら釣られすぎだろ
238デフォルトの名無しさん:2009/06/23(火) 12:44:03
a=*(array+index);
よりも
a=array[index];
のほうがはやいの?
239デフォルトの名無しさん:2009/06/23(火) 12:57:32
>>238
K&Rにも書いてあるように一般的にはポインタ表現の方が
速いとされているが、今時そこまで気にすることもないだろう
240デフォルトの名無しさん:2009/06/24(水) 02:32:02
馬鹿ニートはやっぱり馬鹿っていう結論で落ち着いたようだな。
241デフォルトの名無しさん:2009/06/24(水) 02:37:05
Cのポインタエイリアスの事を聞かれて説明出来ないで結局
>>236が馬鹿だからニートになったって事?
242デフォルトの名無しさん:2009/06/24(水) 02:47:22
>>236は意味が理解できないままインターネットで調べた内容をそのままコピペしたのが
まるわかりだな。
Cのポインタエイリアスって何の事だろね。

限MSDNの__restrictのページとか読んでから来いよな。
ってお前読んでも理解できなかったんじゃないの?

Cも配列の添字アクセスなら問題は出ない。ってどういう根拠よ。 ニートは馬鹿決定だな
243デフォルトの名無しさん:2009/06/24(水) 02:52:32
>>238
少なくとも俺が使ってるコンバイラは同じようなコードが出るよ。

ニートが使ってるコンパイラはおそらく違うんだろうな。
っていうかオプティマイズのかけ方を知らないじゃないの?
244デフォルトの名無しさん:2009/06/24(水) 03:03:18
結局ポインターが使えないフォートランの方がCより最適化しやすいので処理が速いっていう
はっきりした根拠は無いようだな。
ニート君も以前に書かれた内容をコピペしただけではっきりとした根拠は何一つ示してないし
多分フォートランが速いのは別の理由なんだろな
245デフォルトの名無しさん:2009/06/24(水) 03:10:44
>>244
fortranコンパイラってスパコンメーカーが出してるじゃん。
だからベクトルプロセッサー周りのハードウェアに特化した最適化が可能なんじゃね?
文法が簡単な分他の言語よりコンパイラが作りやすいからそれぞれのCPUに特化した
コンパイラをリリースしやすいと思うしfortranが速いのは大方そんな理由だろ。
246デフォルトの名無しさん:2009/06/24(水) 08:44:49
こっちのほうが日本語での説明があっていいんじゃないの?
ttp://seclan.dll.jp/c99d/c99d07.htm#dt19991018

あと、restrictの有り無しと言えばmemcpyとmemmoveの区別もそうでしょ。
memmoveは転送元・転送先に重なりがあってもよい(= restrictになっていなくても良い)の代わりに、memcpyより多少遅くても仕方がない。
memcpyは逆に重なりがあったときの保証がないけど、memmoveより早いと期待される。
もちろん、C99ではmemcpyにだけrestrictが付いている。
247デフォルトの名無しさん:2009/06/24(水) 11:19:21
>>246のおかげで
ポインタエイリアスの事は大体理解できたけど
でも上の例ってCの場合だけじゃなくてfortranの場合でも普通におこるよね?
サブルーチンや関数の内部だと配列がエイリアスを持つ場合があるからね。
248デフォルトの名無しさん:2009/06/24(水) 12:00:05
GNUのFortranが吐いたバイナリを逆アセしてみたが
Cの行列計算ルーチンと大差ない
GNU程度ではだめか

ちゃんとしたスパコンのFortranを解析しないとこの謎は
解けないかもしれん
249デフォルトの名無しさん:2009/06/24(水) 12:01:01
逆に言うとパソコン程度で科学技術計算をやらせるのなら
Fortranなど不要な時代だとも言える

C/C++で十分だ
250デフォルトの名無しさん:2009/06/24(水) 12:05:26
>>247
ttp://www.sgi.co.jp/origin/ODP/documents/programming/compiler/ap/html/chap_2.html
> Fortran はサブルーチンへの複数のパラメータは互いにエイリアスされていないと保証しますが、
> C と C++ では保証されていません。

って書いてあるが。
251デフォルトの名無しさん:2009/06/24(水) 13:03:51
ポインタエイリアスのことも知らずに騒いでたのか、気違い荒らしは
252デフォルトの名無しさん:2009/06/24(水) 13:20:16
お前もしらなかったんじゃないの? お馬鹿ニート君
Cのポインターエイリアスなんてわけ解らん事言ってたし
未だに最適化処理が出来ない理由が謎のままなんだけど

まぁ お前には誰も答えを期待してないようだがな。
253デフォルトの名無しさん:2009/06/24(水) 13:24:39
>>219
>複数のポインターを使うとメモリーのコヒーレンシーを保てないから最適化が難しいという事は
>解ったけど
全然解ってねぇwバカス
254デフォルトの名無しさん:2009/06/24(水) 13:29:50
> 未だに最適化処理が出来ない理由が謎のままなんだけど
お前のような低脳には何を言っても理解不能なようだな
気違いはさっさと精神病院に入院しろよ
255デフォルトの名無しさん:2009/06/24(水) 13:32:16
糞age土方野郎は
ttp://en.wikipedia.org/wiki/Pointer_alias
をきっちり読んでこいや
25630:2009/06/24(水) 13:35:07
だれか >>30 に反論してくれ。
257デフォルトの名無しさん:2009/06/24(水) 13:39:19
>>253,>>254
こいつウゼェー!
コピペするなら意味を理解しろボケ!
お前のようなスキル無しは派遣切られるの仕方が無いが、
キーキーわめくのはスキルが猿のモンキープログラマーじゃねぇの?

258デフォルトの名無しさん:2009/06/24(水) 13:43:09
ちなみに土方野郎は猿ニートのことな
259255:2009/06/24(水) 13:45:07
>>258
お ま え の こ と だ

さっさと読んでこいよ。それとも英語が難しくて読めないか?
260デフォルトの名無しさん:2009/06/24(水) 13:51:51
>>255
In C++, pointer arguments are assumed not to alias if they point to fundamentally different types ("strict aliasing" rules). This allows more optimizations to be done than in C.

これ初めて知った
と言う事はC++は無条件でrestrictポインタと見なされているという事か?
261デフォルトの名無しさん:2009/06/24(水) 13:54:08
>>256
いやだからC++コンパイラは歴史が全然浅いからだよ
齢40年を超えるFORTRANコンパイラに比べれば
まだまだ最適化技術において劣るという事だろう
262デフォルトの名無しさん:2009/06/24(水) 13:59:08
>>260
条件も書いてあるだろ
263デフォルトの名無しさん:2009/06/24(水) 14:04:38
猿ニートってどんな言語でプログラム作ってんの?
264デフォルトの名無しさん:2009/06/24(水) 14:06:22
>>262
あ、本当だ
「違う型」を示してないとだめか
同じ配列では相変わらずか
__restrictキーワードはやっぱり必要だな
26530:2009/06/24(水) 14:19:10
>>261
>>30 の最後の行は無視か。却下。
266デフォルトの名無しさん:2009/06/24(水) 14:32:20
>>255が上げた英文を読んだらますます訳が解らんようになったよ。
結局ポインターエイリアスはCのようなポインターをプログラマーが操作出来る言語に
特有なモノじゃなくてフォートランでも起こりえることなんだよな。
でもフォートランの場合は配列のインデックスをチェックしてエイリアスかどうかを
チェックしてると書いてあったけどインデックスが同じ値かどうかは実行時でないとわかんないよな?
そうすると実行時に余計なチェックが入る分フォートランの方が遅くなるんじゃね?

こんな事を書くとニート訳解んなくなってウッキーになるんだろうな。
267デフォルトの名無しさん:2009/06/24(水) 14:55:23
FortranはそもそもCライクな配列やループを使わず、
配列演算文を使うことができる。
配列演算文の各要素は並列演算可能であることが決められているので
コンパイラは(何も考えずに)これを最適化する。

何せ、もともと並列処理を行うコンピュータに合わせて構文を決めたので。
268デフォルトの名無しさん:2009/06/24(水) 14:59:03
>>267
結局スカラープロセッサじゃ差が無いっちゅうことじゃんか。
269デフォルトの名無しさん:2009/06/24(水) 15:06:42
別に自分はスカラーとかベクトルとか計算機を限定した話はしてないよ。
配列構文の時は配列のインデックスはチェックしないってだけ。
最初から並列演算可能と決め打ちしているから。
270デフォルトの名無しさん:2009/06/24(水) 16:07:03
猿ニートは英文読めたの?
271デフォルトの名無しさん:2009/06/24(水) 16:20:04
配列演算文なんていかにもベクトル計算に特化した構文じゃん
272デフォルトの名無しさん:2009/06/24(水) 16:29:57
おまいら、荒らしは放置しろよ
273デフォルトの名無しさん:2009/06/24(水) 17:54:24
C/C++にもOpenMPあるじゃん
これだけC/C++が広く使われてりゃFORTRANに計算速度で
追いつくのはもはや時間の問題でしかない
274デフォルトの名無しさん:2009/06/24(水) 18:10:48
フォートランの計算速度って言語による速度の差なのかな?
俺はライブラリのチューニングの方が大きいと思うよ。
Cで書かれた数値計算ライブラリにしてもCPUにあわせてカリカリにチューニングしたら
コンパイルが終るまで3日くらいかかるライブラリもあるし、それ使ったら
フォートランよりCの方が速かったよ。
275デフォルトの名無しさん:2009/06/24(水) 19:57:29
void copy( const char (&src)[256], char (&dst)[256] );
当然ながら、これの最適化は__restrictポインタより
劣る。
参照使いながら、ポインタより劣るケースがあるってのは
何気に困るなぁ。
276デフォルトの名無しさん:2009/06/24(水) 19:58:22
>>274
>コンパイルが終るまで3日
本当かよ。もしかして真空管の時代?
277デフォルトの名無しさん:2009/06/25(木) 03:46:27
とりあえず, 最適化し易い死にくいはあるが,
言語というよりは, コンパイラの問題.
今のところは, FORTRAN がちょっぴり優勢.

って事でOK?

あぁ・・・.
スレタイの回答は誰も書いていないような・・・.

278デフォルトの名無しさん:2009/06/25(木) 08:51:52
猿ニート以下の突っ込みだな。
279デフォルトの名無しさん:2009/06/25(木) 09:08:34
>>277
オプティマイザの中にはフォートランやCのソースに手を加えるんじゃなくて
機械語のソースに手を加えて、しかも実際に走らせて実行時間を計測して
最適化の効果を確認しながら行なうやつがあるよ。
280デフォルトの名無しさん:2009/06/25(木) 13:58:19
restrictってだんだん無意味に思えて来た
281デフォルトの名無しさん:2009/06/25(木) 13:58:26
機械語の最適化はどうでもいいでしょ。言語と関係ないんだから。

言語による最適化の差が機械語レベルでの最適化で消せるわけでもないし。
282デフォルトの名無しさん:2009/06/25(木) 14:03:55
実際restrictってヒントでしかないし
VC++の__restrictの場合、インライン関数のように
コンパイル時に中身いじれるケースだと、
__restrict無視して勝手に最適化するようだ。
283デフォルトの名無しさん:2009/06/25(木) 14:16:55
自動並列化とかがもっと実用的になってきたらrestrict絶対必要になるね〜

今はそれほど重要じゃない気がする。
284デフォルトの名無しさん:2009/06/26(金) 01:11:38
restrictって並列化の為に必要なんじゃなくてreorderingを使って最適化するために
メモリーアクセスの順番を把握するために必要と書いてあったよね。
でもreorderingってスーパースカラー型のCPUじゃないと意味無いし
今のCPUの主流はパイプラインピッチを狭めたスーパーパイプライン型CPUを複数個
まとめた構造じゃん。
俺はrestrictなんて意味無いようなきがするよ。
285デフォルトの名無しさん:2009/06/26(金) 03:33:32
スーパーパイプラインってPen4だろ
今はアーキテクチャーが変わってるだろうに
286デフォルトの名無しさん:2009/06/26(金) 09:17:08
まぁiccにも-restrictオプションがあるし、Intelの資料に拠れば
最適化に役立つそうだけどね。
287デフォルトの名無しさん:2009/06/26(金) 13:36:15
>>284
別にお前のために用意されたキーワードではなく
「ベクトル演算が可能なプロセッサ用コンパイラ」を使い、なおかつ
「ベクトル演算を必要とするプログラマ」のためのものなので、
お前にとって意味があるかどうかなど、他の誰にとってもどうでもいい話だ。
288デフォルトの名無しさん:2009/06/26(金) 14:07:10
>>284
restrictはいろんな目的の為に重要で,自動並列化の為にも必要不可欠。
もちろんキャッシュ最適化の為にもね。

たとえば
for (i = 0; i < n; i++)
a[i] = b[i];
のような簡単なコードでもa,bの領域が重なっているか分からなければ並列化不可能。

今のところはキャッシュ最適化の方が重要だけど、じきに自動SIMD化や並列化の重要性が目立ってくると思う。
289デフォルトの名無しさん:2009/06/26(金) 14:31:37
必要かどうかは、ここで結論を出さなくても今後の開発されるコンパイラの動向を
見てたらわかるとおもう。

ただ、共有メモリーを複数のプロセッサーで処理する並列化はバスのボトルネックや
メモリーの排他的アクセスによるデッドロックの回避なんかの問題があるので
メッセージパッシングによる並列化が流行りそうだけどな。
290デフォルトの名無しさん:2009/06/26(金) 14:37:01
>>287
お前ひょっとして猿ニート?
スキルが無いのに態度がでかいからすぐ解るよ。
291デフォルトの名無しさん:2009/06/26(金) 15:09:59
エスパー参上プゲラ
292デフォルトの名無しさん:2009/06/26(金) 16:46:32
>>290
反論でも言い訳でもないとは。
293デフォルトの名無しさん:2009/06/26(金) 18:32:35
http://www.kasahara.elec.waseda.ac.jp/achieve/pdf/mase080513arc.pdf

Cでもポインタ解析ちゃんとやれば結構速くなるよって言う論文。
294デフォルトの名無しさん:2009/06/26(金) 18:46:39
てかさ、Fortranでいいじゃん。
295デフォルトの名無しさん:2009/06/26(金) 21:56:25
結局Fortranだと何%位速いの?
296デフォルトの名無しさん:2009/06/26(金) 22:02:31
そんなもん、環境によりけりだろ
Fortranにだってへっぽこなコンパイラもあるしな
たとえばg(ry
297デフォルトの名無しさん:2009/06/27(土) 00:18:20
フォートランが速いのはベクトル計算だけ。
それ以外はCとかの方が速いよ。
そもそもベクトル計算なんて処理がワンパターンだからどんな言語でも速いとおもうよ。
だってライブラリー化されてるから言語関係ないもん。
298デフォルトの名無しさん:2009/06/27(土) 01:46:38
C++のこのインタビューは本当なの?http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
299デフォルトの名無しさん:2009/06/27(土) 02:01:12
最後まで読めやカスが
300デフォルトの名無しさん:2009/06/27(土) 08:53:18
>>299ジョーク記事だったわカスが
301デフォルトの名無しさん:2009/06/27(土) 09:03:29
URL見てきづけよな
302デフォルトの名無しさん:2009/06/27(土) 09:31:23
URL…あぁ

愚かだなぁ俺(●^ー^●)
303デフォルトの名無しさん:2009/09/20(日) 07:09:45
ExpressionTemplateの話題少ないな。
PCでGPUついてんだったら

GpGPU gpu(・・・);//GPU初期化
GPU::Vector<double> vec1,vec2,vec3;
gpu(vec1=vec2*vec3);//式テンプレートで作成したGPUコードを送信

なんて式でFortranより高速に書けるんだがな。
ま、FORTRANがGpGPUサポートし始めたら知らんけど。
304デフォルトの名無しさん:2009/10/16(金) 07:05:53
ローカル変数の方がコンパイラが最適化しやすいといわれますが、
定数の場合はどうなのでしょうか?
何度も呼び出す関数内の定数も関数内でローカルにした方がよいのでしょうか?
それともグローバルにした方が、キャッシュに残りやすいのでしょうか?
305デフォルトの名無しさん:2009/10/16(金) 09:03:49
整数なら即値命令に落とされるかも知れんし
アーキテクチャに因るとしか。
306デフォルトの名無しさん:2009/10/16(金) 11:20:57
定数ならコンパイラが良きに計らってくれるのでどこにあっても大差ない。
307デフォルトの名無しさん:2010/01/16(土) 04:06:17
PGってなんだよ!
308デフォルトの名無しさん:2010/01/16(土) 08:52:46
P&G
309デフォルトの名無しさん:2010/01/18(月) 00:16:59
プロフェッサーギル
310デフォルトの名無しさん:2010/05/28(金) 11:10:04
Intel C++のベクトル化で苦労しています。
どこか指南してくれるページはありませんか?
311デフォルトの名無しさん:2010/05/28(金) 11:28:59
>>310
・iccについてくるorWebで拾える最適化リファレンスマニュアル
・XLsoft主催の講習会
・ここ
312デフォルトの名無しさん:2010/07/16(金) 13:41:06
演算子定義って、最適化には問題ないの?
ベクトル化、自動並列化、アンローリング、等々・・・
313デフォルトの名無しさん:2010/07/16(金) 14:17:05
restrictポインタを使えばC++に対するFORTRANの優位性は無くなるな
ただしFORTRANには今まで蓄積された豊富なライブラリ群がある

C系言語とFORTRANでは行列にした時に行と列が逆になるという問題がある
まあ転置して渡せばいいんだけど
314デフォルトの名無しさん:2010/07/24(土) 02:45:44
行と列入れ替えてもうまくやってくれる賢いCコンパイラが出てきたような。
315デフォルトの名無しさん:2010/07/24(土) 07:29:11
C++で extern "FORTRAN" がまともに使えればいいんだよな
316デフォルトの名無しさん:2010/07/27(火) 19:30:41
Fortranはコンパイラ作る側もプログラム作る側も楽なんじゃないの?
多分
317デフォルトの名無しさん:2010/07/28(水) 00:15:38
C++難しいし、OOPなんて数値計算には不要。
データ構造は配列だけあればよい。

分岐はなるたけなくして(したがって、差分プログラミング不要)
配列をindexアクセス、ループをブン回すだけというのが
数値計算やで
318デフォルトの名無しさん
まぁ数値計算つっても色々あるだろうけど
科学系のガチな数値計算ならそうだな