いてつくブログ

2ちゃんねるのスレッドをコピペしてまとめてみるブログ

実行

PC等【GPGPU】くだすれCUDAスレ part5【NVIDIA】

1 :デフォルトの名無しさん:2011/08/23(火) 22:08:06.09
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
CUDA使いが優しくコメントを返しますが、
お礼はCUDAの布教と初心者の救済をお願いします。

CUDA・HomePage
http://developer.nvidia.com/category/zone/cuda-zone

関連スレ
GPGPU#5
http://hibari.2ch.net/test/read.cgi/tech/1281876470/

前スレ
【GPGPU】くだすれCUDAスレ【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1206152032/
【GPGPU】くだすれCUDAスレ pert2【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1254997777/
【GPGPU】くだすれCUDAスレ pert3【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1271587710/
【GPGPU】くだすれCUDAスレ pert4【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1291467433/

159 :デフォルトの名無しさん:2011/11/27(日) 22:05:36.51
全スレッドの計算結果を1コアに集約して1スレッドで処理したいんだけどいい方法あるかな?
リダクションのサンプルだと最後はCPUで合計だしこれでは都合悪いんだよね
全てGPUでやりたいのよね

195 :デフォルトの名無しさん:2011/12/07(水) 00:45:36.69
+=で同じアドレスに同時書き込みしてるから

197 :デフォルトの名無しさん:2011/12/07(水) 01:27:31.21
競合状態が発生してんじゃないの?
atomic演算とか同期が必要だと思うよ。
512スレッドで同一アドレスの変数の読み書きしてんだから。

まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
書籍ならcuda exampleも買って読むといいかもね

198 :デフォルトの名無しさん:2011/12/07(水) 02:05:18.21
>>197
>競合状態が発生してんじゃないの?
>>195のコメと合わせて考えるに、なんとなく予想はしてましたけど、取り合いになってるんですね...

>atomic演算とか同期が必要だと思うよ。
まだザックリとしか勉強してないので、atomic演算は知らなかったです。あとで試してみます。
同期を行う場合だったら、どうすればいいのだろう。

>まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
それは分岐条件がきちんと実行しているのか見るためのテストをしたとき確認しました。

274 :デフォルトの名無しさん:2012/01/06(金) 20:14:34.67
環境
Windows7 Professional 64bit
Microsoft Visual C++ 2010 Express Version 10.0.40219.1
Microsoft .NET Framwork Version 4.0.30319
GeForce GTX 580
CUDA Toolkit 4.0.17
SDK 4.0.19
devdriver_4.0_winvista-win7_64_270.81_general

この(ピヨピヨ)を参考に環境を構築しました。
http://feather.cocolog-nifty.com/weblog/2011/07/visual-studio-2.html
そして以下のサイトのサンプルプログラムを実行してみました。
http://www.gdep.jp/page/view/218
Hello,Worldと99 bottles of beerはcpu、gpu共に実行できました。
しかし、Matrixのプログラムはcpuの方は実行できるのですがgpuの方が実行できません。
以下のエラーを吐きます。
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h'
: No such file or directory
どうやらVisualStudioのパスがうまく通ってないということまでわかり、以下のサイトなどを参考にCUDA_INC_PATHなどを変えてみましたが、一向に変わりません。
http://d.hatena.ne.jp/Levi/20090921/1253535802#c
SDK内のcutil_inline.h自体をtoolkitのincフォルダにコピペすると、他の.hファイルもいくつか同じエラーが出たのでエラーになったものをすべてコピペしたところ、LNK2019"link.exe"というエラーで先に進めませんでした。
一度VisualStudioを再インストールしてみましたが、状況は変わりません。
Nvidia GPU computing SDK Browserではサンプルプログラムを実行できているので、CUDAの環境は整っていると思われます。
どうすれば解決できますでしょうか・・・。かれこれ1週間以上格闘しています。
VisualStudioは2010よりも2008にした方がいいでしょうか?


275 :デフォルトの名無しさん:2012/01/06(金) 20:23:04.24
C初心者にはきついと思うんだが…
とりあえず 'cutil_inline.h'のある場所を見つけて
そこを-I /'cutil_inline.hのある場所'と指定する

意味わからなければCのコンパイルを勉強すること

292 :デフォルトの名無しさん:2012/01/09(月) 18:01:50.03
>>275

274です。
-Iオプションを付けてヘッダファイルのある場所を指定してみましたが、相変わらず同じエラーです。

C:\cuda_practice\test>nvcc -o matrix_gpu.exe matrix_gpu.cu -I C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common\inc
matrix_gpu.cu
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h': No such file or directory

自分でも試行錯誤してみますが周りにcudaがわかる人がいなくて行き詰ってます・・・。

298 :デフォルトの名無しさん:2012/01/10(火) 17:15:02.61
sharedメモリって同一WARP内でのやり取りだったら同期なしで大丈夫なのでしょうか?
たとえば全部で32スレッドで次のkernelを実行した場合、
WARP内で一斉にsharedメモリに書きに行くので同期しないで大丈夫かと
思ったのですが、実際にはうまくいきません。
globalメモリに読みに行く段階でコアレッシングが発生していないので
それが原因なのでしょうか?
どなたか教えてください。

__global__ void kernel(float *g_v, float *g_x){
float x = 0.0f;
int i = blockDim.x * blockIdx.x + threadIdx.x;
__shared__ float s_v[32];

s_v[i] = g_v[i+i%3];
__syncthreads(); // これが必要かどうか?
x = s_v[(i+3)%32];
g_x[i] = x;
}


299 :デフォルトの名無しさん:2012/01/10(火) 17:35:07.81
>>292

参照パスを ""で囲む♪

355 :デフォルトの名無しさん:2012/01/24(火) 19:53:55.48
コンパイル時に以下のエラーメッセージが出ているのですが、
ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)
これはローカルメモリーと何か関係あるような気がするのですけど、
ちょっとわからないので教えて頂けないでしょうか。
宜しくお願いします。


357 :デフォルトの名無しさん:2012/01/24(火) 21:56:32.01
> ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)

単に配列の次元が大きすぎるのでは?

最大 0x4000バイトのところを0x16054 bytes使おうとしている?


> ホスト・デバイスともに共有させたい場合はどうしたらいいのでしょうか?

物理的に無理でないの?

ホスト←→デバイス間でコピーしないといけないのでは??


358 :デフォルトの名無しさん:2012/01/24(火) 21:56:54.10
>>355
メッセージそのままの意味だろ。

362 :355,356:2012/01/25(水) 15:21:00.98
>>358
青木氏の「はじめてのCUDA」に似たようなエラーメッセージが載ってるのですが、
local dataがどの部分の話なのか、ちょっとわからない状態でして...

>>357
>単に配列の次元が大きすぎるのでは?
予定だと1×256スレッドしか使うので、足りないはずないような... 意味が違うか。
ちょっとわからないので詳細お願いします。

>ヘッダーファイルに
>#DEFINE
>などで定義して、ホストとデバイスのプログラムに そのヘッダーファイルをinclude する手があった♪

ちょっと試してみます。それができなかったら、コピーするしかないかもしれません。
__device__ extern TEST test;
のような宣言してて、実行ファイルができたときがあったのですが、何か違うよな、と引っかかってたので、
ここで質問しました。ありがとうございます。



363 :デフォルトの名無しさん:2012/01/25(水) 17:40:16.56
差し支えなければプログラムをアップしてくださいませ♪

364 :デフォルトの名無しさん:2012/01/25(水) 18:01:06.82
>>362

この(ピヨピヨ)の一番下にある資料の3-41ページにそのエラーメッセージが載っている模様。
http://accc.riken.jp/HPC/training.html






365 :355,356:2012/01/25(水) 18:04:09.31
>>362です。

>>363
申し訳ないのですが、プログラムのアップは出来ないです。すみません。

なんかもう分からなくなったので、ホストとデバイスの住み分けを行ったところ、
「ptxas error...」云々のメッセージが消え、コンパイルできました。
(さっきまでhost,device,global宣言関数がごちゃ混ぜな状態だった。)
何が原因だったのか分からず仕舞いです。

グローバル変数の共有はとりあえず、コンスタントメモリにデータコピーで様子見することにしました。
元コード(.c)をもう一度読み直したところ、デバイス側の方はReadOnlyで十分なようでしたから。

皆様回答ありがとうございました。またよろしくお願いします。



366 :365:2012/01/25(水) 21:05:50.75
>>364
資料ありがとうございます。
うまくいったと思った途端、また同じエラーが出てきてしまったので、確認します。

.cファイルに.cuファイルを組み込ませるようにしたら、
__host__ __device__で修飾した関数が定義されてないと.cファイル側に言われ、
.cファイルと.cuファイルそれぞれ単独で動かせるようにしたら、
(同じ内容の関数を.cと.cuそれぞれ別名で実体作った。.c:test .cu:ktestみたいな)
今度はさっきと同じエラー。

実行ファイル作るだけなのに難しい...

368 :デフォルトの名無しさん:2012/01/26(木) 08:53:13.45
取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。

370 :366:2012/01/26(木) 16:19:08.01
>>368
>取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。
のように手順を踏んでコンパイルしたところ、実行ファイルができました。
皆様ありがとうございました。

371 :370:2012/01/26(木) 20:33:24.55
お恥ずかしながら、また戻ってきました。
あれからセグメンテーション違反が出てきてしまったので、あれこれ探していた結果、
どうやらデバイスのメモリ確保&送信に失敗していたようです。

しかし解せないことがあって、
構造体A a,構造体B b[100],構造体C c[100],...(以下略 をデバイス側に送るのですが、
(1つ1つのサイズは結構大きめ。グローバルは1GBあって余裕で確保出きるハズ...)
void main(){
・・・
test(&a,b,c....);
}
void test(A *a,B *b,C *c...){
A *d_a; B *d_b; C *d_c;
CUT_SAFE_CALL(cudaMalloc((void**)&d_a,sizeof(A)));
CUT_SAFE_CALL(cudaMemcpy(d_a,a,sizeof(A),cudaMemcpyHtoD));

CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
・・・

はじめてcuda,cuda_by_exampleで確認したところ、
文法的ミスはないはずなのに確保ミスしてるらしく、中断してます。

この原因は一体全体なんなんでしょうか。




372 :デフォルトの名無しさん:2012/01/26(木) 21:28:56.32
4.1正式版
CUDA Toolkit 4.1 | NVIDIA Developer Zone
http://developer.nvidia.com/cuda-toolkit-41


373 :デフォルトの名無しさん:2012/01/26(木) 21:55:28.42
構造体の中身がよく分からんが,allocateのところで *100は必要なのかな?

構造体Bのメモリーを100個分用意しようとしている??

構造体Bの中にすでに [100]個の配列を取っているのに???

数は合っておるのか????

375 :デフォルトの名無しさん:2012/01/27(金) 00:03:32.49
>>372
遂にRC取れたか!4.0からどう変わってるか知らんけど。
Kepler向けのプログラムを作れるのは5.0とかになるんだろうか。
そしてそれはいつ出るんだろう。

>>371
1GBのVRAM積んでるカードでも400MBぐらいの確保で失敗したことがあったような覚えがある。
確保するサイズを小さくしてもエラーが出るってんならこの話は忘れてくれ。

383 :371:2012/01/27(金) 18:15:48.81
>>373
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
これはミスですね....
正しくは
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B),cudaMemcpyHtoD));
です。すみません。

>>375
4000MBの領域確保でも失敗することがあったんですか...
ちょっと試してみます。

387 :383:2012/01/28(土) 17:54:35.37
>>371
なんかサンプルがめちゃくちゃなんで書き直します。

388 :387:2012/01/28(土) 20:55:21.49
確認なのですけど、カーネル関数の引数はポインタ限定ですか?

671 :デフォルトの名無しさん:2012/04/29(日) 14:44:53.67
GPUのデメリットは同じ変数計算を毎回糞真面目に超高速で行うところ

719 :デフォルトの名無しさん:2012/05/17(木) 21:52:07.76
多次元配列を扱えないのは何でなんだろう.

ブロックとスレッドインデックスで一次元化するの面倒なんだけど.

737 :デフォルトの名無しさん:2012/05/23(水) 14:44:51.35
詳しい方に質問させてください。
Win7Pro64 + VC2010Pro + CUDA4.2で32bitのdll (Matlabのmex)を
作成して、カーネル(1回のみ呼び出し)の実行時間を計測しました。
Nsight Visual Studio Editionのプロファイルでは約3583msとなったのですが、
メイン関数側でカーネル呼び出しの時間を調べると12079msとなりました。
この差の原因がわからずに困っているのですが、心当たりのある方は
いらっしゃいませんか?
足りない情報などあればツッコんでください。
よろしくお願いします。

738 :デフォルトの名無しさん:2012/05/23(水) 15:16:21.45
>>737
詳細は実際のコードを見ないと判らないけれど、カーネル呼び出しは完了復帰じゃないよ。
逆に、それを巧く利用すればGPUとCPUで並列処理ができるって寸法だ。

739 :737:2012/05/23(水) 15:25:51.83
>>738
レスありがとうございます。
メイン関数側での測定は、カーネル呼び出し後に
cudaThreadSynchronize();
としてから測定していますが、これではダメですか?
これを入れ忘れると、メイン関数側での測定時間が極端に短くなる
という話はよく目にするのですが、今回は逆に、メイン関数側での
測定時間が極端に長くなっています・・・・

758 :デフォルトの名無しさん:2012/06/02(土) 02:34:05.01
CUDAで計算した結果をDirect3Dで描画したいんですが、
同じプログラム内で同時に使っても問題ないでしょうか?
一つのGPUがCUDAとDirect3Dを切り替えて使うので、
切替のオーバーヘッドとか大きかったりするんでしょうか??

777 :デフォルトの名無しさん:2012/06/08(金) 14:37:45.13
カーネル関数で乱数使いたいとき、みんなどのライブラリを使ってるの?
curandとtinymtは使ったことがあるんだけど、他におすすめある?

829 :デフォルトの名無しさん:2012/08/02(木) 16:58:06.96
最近CUDAの勉強を始めて、試しに画像処理アプリをGPU用に書き換えているのですが
どうしても分からないことがあるので質問させてください

double *a[5],*d_a[5];
int size=1280*1024; //実際には読み込んだ画像のサイズが入ります
for(i=0;i<5;i++){
a[i]=(double *)calloc(size,sizeof(double));
for(j=0;j<size;j++)a[i][j]=i*j; //ここのi*jは実際には読み込んだ画像の画素情報が入ります
}
for(i=0;i<5;i++)cudaMalloc((void**)&d_a[i],sizeof(double)*size);
for(i=0;i<5;i++)cudaMemcpy(d_a[i],a[i],sizeof(double)*size,cudaMemcpyHostToDevice);
func<<< Dg, Db >>>(d_a);

__global__ void func(double *f_a[5]);
上記のf_a[5]の、ホストにおけるa[i][j]にあたる値を参照するにはどうしたらよいでしょうか
ホスト同様にf_a[i][j]とすると
Warning: Cannot tell what pointer points to, assuming global memory space
上記の警告が出て上手くいきません
超初歩的な質問かと思いますが、アドバイス宜しくお願いします

830 :デフォルトの名無しさん:2012/08/02(木) 17:15:58.20
>>829
d_aはホスト上の配列。そいつへのポインタを渡してもなんともならない。
d_aが固定長でいいなら、__global__ void func(doule * f_a0, doule * f_a1, doule * f_a2, doule * f_a3, doule * f_a4);
とするのが手っ取り早い。
d_aが可変長だったり巨大だったりするなら、
double ** dPtrArray, ** hPtrArray;
hPtrArray = malloc(sizeof(* hPtrArray) * length);
cudaMalloc((void **) & dPtrArray, sizeof(* dPtrArray) * length);
for (int ic = 0; ic < length; ++ic) {
cudaMalloc((void **) & hPtrArray[ic], sizeof(* tmp) * size);
cudaMemcpy(hPtrArray[ic], a[ic], sizeof(double) * size, cudaMemcpyHostToDevice);
}
cudaMemcpy(dPtrArray, hPtrArray, sizeof(* hPtrArray) * length, cudaMemcpyHostToDevice);
とでもしないと。

853 :デフォルトの名無しさん:2012/08/06(月) 23:15:24.01
C++とCUDAを連携させたプログラムを作成しているのですが、どうしても解決出来ない問題が発生してしまったので教えて下さい。
C++のスレに質問するか迷ったのですが、エラーにはCUDAがメインで関わっていると思ったのでこちらに書き込みます。

C++のプログラムからCUDAのプログラム(既にexeになっているもの)を実行したいと思い、下記のようなプログラムを作成したのですが、
CUDAプログラム単体では動いているのにC++のプログラムから呼び出すと実行時にエラーが発生してしまいます。

SDK内のサンプルプログラムでも実行エラーになってしまうので、CUDAプログラム側のバグでは無いと思うのですが…
system関数では実行出来ないのでしょうか?system関数以外でも良いのでなんとか実行する方法が知りたいです。


int _tmain(int argc, _TCHAR* argv[])
{

int ret;

printf("CUDAプログラム実行開始\n");
ret = system("\"D:\\Program File\\Test_Print.exe\"");
if(ret == 0)
{
printf("プログラム実行成功\n");
}
else
{
printf("プログラム実行失敗\n");
}

}

854 :デフォルトの名無しさん:2012/08/06(月) 23:54:55.12
そのTest_Print.exeと同じ場所に何でもいいのでC++で作った何か*.exeを置いて同じことを試してみなよ。
俺があてずっぽうで言うとたぶん同じようにうまくいかないつまりCUDAがどうこうって問題じゃない。

857 :デフォルトの名無しさん:2012/08/07(火) 03:43:55.76
>>853
system関数のマニュアル見てエラーの値をしらべたら?

869 :デフォルトの名無しさん:2012/08/11(土) 20:06:38.41
超基本的な質問をしたい。

「はじめてのCUDAプログラミング」を読んで色々動かしてるんだが、
ブロックとスレッドとSMとSPのそれぞれ関係がいまいちモヤッとしてる。

最初から順に読んでいて、57 ページの次の説明で躓いた。

> スレッド当たりのレジスタ数が
> 「SM当たりのレジスタ数 / ブロック内のスレッド数」
より多い時は、「カーネル関数」を実行できなくなります。

SM や レジスタは物理的なもので、ブロックやスレッドは論理的なものなのに、
なんでごちゃ混ぜになってるのか・・・

その少し後のページも見たり、直前の Warp の説明を読んで
俺なりに考えた結果、次のような認識なのだが、これは間違ってる?

・1つの SP は一度に1つのスレッドを処理する
・1つの SM は一度に1つのブロックを処理する


http://toro.2ch.net/test/read.cgi/tech/1314104886/l50/../人気ブログランキングへ

PC等やっぱり動的言語では安全なソフトは作れない 4

1 :デフォルトの名無しさん:2011/09/15(木) 01:12:57.20
まだまだ需要がありそうなので立ててみました

前スレ
http://hibari.2ch.net/test/read.cgi/tech/1308499587/

2 :デフォルトの名無しさん:2011/09/15(木) 01:14:17.69
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所



19 :デフォルトの名無しさん:2011/09/16(金) 23:18:35.65
つまり、変なことをしなければ
Javaの方が当然安全ということだ。

23 :デフォルトの名無しさん:2011/09/17(土) 06:52:07.65
>>19
Javaでは変なことはしないが、動的言語では変なことをするという前提?
それとも、動的言語では変なことをしなくても安全じゃないってこと?だとしたら何故?

24 :デフォルトの名無しさん:2011/09/17(土) 09:45:55.08
>>23
無駄な柔軟性があるから。

たとえばグローバル変数にしておけばどこからでも値を変えられて便利じゃね?
gotoがあればどこにでもジャンプできて便利じゃね?

動的言語の不必要に高い柔軟性はこれと同じ。安全にするのであれば制限を加えたほうがいい。

どうせ同じ変数に互換性がない型を入れたりしないので変数には型をもたせたほうがいい。
実行時にコードを柔軟に書き換える機能なんて持たせずに
継承とか多態とかそういう名前で制限される方法を使ったほうがいい。

こういう制限を持たせることで、その制限に反すること
(例 ローカル変数を触れない場所から書き換えようとすること)を
静的にチェックできるようになる。

79 :デフォルトの名無しさん:2011/09/18(日) 22:17:32.31
アヒルのように振る舞うならばアヒルである

これは論理的に言って間違い。
アヒルのように振る舞う、動物モノマネ王はアヒルではない。


98 :デフォルトの名無しさん:2011/09/19(月) 02:42:36.91
ここでスレタイに沿いたいのだが、安全なソフトウェアの定義をしたい。
おれの定義はこれだ。

「数百人 x 数十か月 の開発工程の結果、容易に保守可能なソフトウェアを生産できるか?」

経験上、Javaであれば問題なく可能だ。数百人のうち9割9分はドカタでも構わない。
企業にとったらこんなありがたい言語はない。
Rubyではこうはいかないし、Cも論外だ。優秀な数百人を集めないと、同様の保守性を期待する
ことはできない。
だから、Javaはプログラマとしては唾棄すべき言語だが、管理する側にとってはこれ以上ない
言語なんだ。

127 :デフォルトの名無しさん:2011/09/19(月) 12:12:03.18
取り敢えず、これでも各言語で書いて安全性と保守性を検証して見ては?

>>601
>ちょっと感動したんで書いとく

>まずはプログラミングhaskellからの引用


>x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。ピタゴラス数のリストを生成する関数pythsを定義せよ。ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。

>以下に例を示す。

>>pyths 10
>[(3,4,5),(4,3,5),(6,8,10),(8,6,10)]

>引用終わり

>これ、haskellで書くと(と言うか、リスト内包表記使える言語だと同じ感じ)、こうなるんだけど、

>pyths n = [(x,y,z) | x <- [1..n], y<-[1..n], z<-[1..n], x^2+y^2 == z^2]

>リスト内包表記以外の方法だとこんなに短く書け無いんじゃ無かろうか

>pythonはリスト内包表記あるの知ってるけど、他の言語でも、こんなに短く書けるんだろうか。。。


148 :デフォルトの名無しさん:2011/09/19(月) 23:46:38.18
>>127

・Java

public??static??List<Integer[]>??pyths??(int??n)??{
????????List<Integer[]>??list??=??new??ArrayList<Integer[]>();
????????for??(int??x??=??1;??x??<=??n;??x++)??{
????????????????for??(int??y??=??1;??y??<=??n;??y++)??{
????????????????????????for??(int??z??=??1;??z??<=??n;??z++)??{
????????????????????????????????if??(x??*??x??+??y??*??y??==??z??*??z)??{
????????????????????????????????????????Integer[]??a??=??{x,??y,??z};
????????????????????????????????????????list.add(a);
????????????????????????????????}
????????????????????????}
????????????????}
????????}
????????return??list;
}

150 :デフォルトの名無しさん:2011/09/20(火) 03:14:28.88
>>148が一番コードが読みやすいな。

162 :デフォルトの名無しさん:2011/09/20(火) 12:34:13.70
>>127は保守性を検証と言ってるから
関数pythsをどれくらい簡単に拡張できるかも評価しては?
例えば、条件式??x^2??+??y^2??==??z^2??を引数で渡せるように一般化するとか

Pyton

def??pyths(f,??n):
????????return??[(x,??y,??z)??for??x??in??range(1,??n+1)??for??y??in??range(1,??n+1)??for??z??in??range(1,??n+1)??if??f(x,??y,??z)]
print(??pyths(lambda??x,y,z:??x*x??+??y*y??==??z*z,??10)??)

245 :デフォルトの名無しさん:2011/09/22(木) 08:43:08.09
> 安全なプログラムを作成・保守するにはソースコードは簡潔であるべき。
> そして、このスレ見ても分かるように、変数の型は書かないほうが
> アルゴリズムに関係無い情報(ノイズ)が無くて読みやすい。

それは数行で終わるような処理の話であって、
普通は1ファイル1000行ぐらいにはなるし、
別のファイルからの呼び出しも発生する。

その場合に、コードを読むための必要な情報(型など)が
近くにないとコードを理解するのに、いろんなことを
考えないといけなくなる。

そのため、このスレに書ける程度の短いコードを例に出すこと自体が
動的言語有意になってる。全くもって現実的ではない証明方法だ。


301 :デフォルトの名無しさん:2011/09/22(木) 20:03:22.55
静的言語と動的言語の違いが分からないので外延的に定義してください

304 :デフォルトの名無しさん:2011/09/22(木) 20:23:54.18
>>301

動的言語:Perl,??Python,??Ruby,??Prolog
静的言語:C,??C++,??Java

残り埋めて

305 :デフォルトの名無しさん:2011/09/22(木) 20:35:37.41
>>304
この辺も動的だわ

PHP ECMAScript全般 lisp sh系全般
PostScript Objective-C Smalltalk
Haskel

306 :デフォルトの名無しさん:2011/09/22(木) 21:35:24.38
>>305
なんでHaskellが動的言語なの?

350 :デフォルトの名無しさん:2011/09/24(土) 18:38:02.33
ベクトルの内積

let??(??*-??)??a??b??=??List.fold_left2??(fun??x??a??b??->??x??+.??a??*.??b)??0.??a??b

もし型注釈が必須だとこうなる

let??(??*-??)??(a??:??float??list)??(b??:??float??list)??:??float??=
????List.fold_left2??((fun??x??a??b??->??x??+.??a??*.??b)??:??float??->??float??->??float??->??float)??0.??a??b

352 :デフォルトの名無しさん:2011/09/24(土) 18:50:54.40
>>350
多少文字数が減る程度微々たる問題過ぎる
継承関係無視とかメッセージ転送とかもっとマトモなネタを出せよ

361 :デフォルトの名無しさん:2011/09/25(日) 03:00:21.59
やっぱり動的型付け言語では安全なソフトは作れない
http://hibari.2ch.net/test/read.cgi/tech/1316887046/

>OO関連及び動的言語関連で事あるごとに争っている
>静的型付け厨と動的型付け厨が、思う存分飽きるまで仲良く
>罵り合う為のスレです。

>スレの進行を妨げる型安全議論を見かけた場合は、
>こちらへの誘導をお願いします。

362 :デフォルトの名無しさん:2011/09/25(日) 03:35:55.84
>>350
名前付きの関数作るんだったら、最初から名前付き関数作れば?
代入するだけ無駄だろ。何のための無名関数だよ。

371 :デフォルトの名無しさん:2011/09/25(日) 07:13:54.34
>>362
は?ベクトル内積演算子をfold_left2で実装してるんだろ
こうやって新しく関数を作るのは高階関数とカリー化がある言語では当たり前
馬鹿は黙ってろよ

374 :デフォルトの名無しさん:2011/09/25(日) 11:27:34.04
>>361
このスレ自体が隔離スレなのに、さらに隔離するとか鬼か

メタプログラミングで型を副作用付きで拡張する(モンキーパッチ)には動的型が必要だし、
動的言語と動的型言語がイコールでなくても、わざわざ別スレ立てるほどじゃない

376 :uy:2011/09/25(日) 13:47:17.23
実際、LL支持者って、安全かどうかじゃなくて
自分が楽できるかどうかで物言ってるんだろ
でもそれでいいと思うよ

静的言語とか今更バカらしい
一度動的言語のよさを知っちゃうと、二度と静的言語なんて触りたくなくなるからね
趣味のプログラミングで、動的言語でも速度的に間に合うようなソフトを
静的言語で作ってるゴミカスってバカじゃないの?w
そのゴミカスが学生とかならいいんだけど、良い年いっていたり、(キリッ)としながらブログかいてたりすると
周りも教えてやるに教えてやれないんだよね^^;

動的言語でやっていくことが大前提で、その上でどうすればよいかを考えるべき

378 :デフォルトの名無しさん:2011/09/25(日) 14:09:10.78
数行で収まる関数を作るなら動的言語が作るの早いけど
関数やクラスの集まりであるシステムを作ると
逆に静的言語のほうが早く作れるんだよね。

それはコーディング以外占める量が大きくなるからだろう。
コーディング以外っていうのは、設計したり、コードを読んだり
修正の時の影響範囲を調べたりとかそういうことね。

動的言語だと、どうしても影響範囲の把握に時間がかかる。

380 :デフォルトの名無しさん:2011/09/25(日) 15:07:48.58
>>378
動的型付けと静的型付けの差異ならそんなこともあるだろうけど、
このスレで対象にしている動的、静的の差異ではちょっと考えられないな。

381 :デフォルトの名無しさん:2011/09/25(日) 15:12:44.77
あれ、そもそも動的、静的の差異で
動作速度に差なんてできたっけ?

そもそも>>376が言っていることが意味不明なんじゃ?

382 :デフォルトの名無しさん:2011/09/25(日) 15:28:17.07
>>371
代入してる事にかわりないだろ。
あと静的型付けでも推論規則で文字数は減らせるが、
それは知らんのだろうな。

384 :デフォルトの名無しさん:2011/09/25(日) 15:44:37.17
>>380
動的、静的って言ったら普通は型の話で、
>>2見る限りこのスレも型の話だと思ったんだけど、
このスレが対象にしてる動的、静的ってなんなの?
evalができるとかそういう奴?

426 :デフォルトの名無しさん:2011/09/26(月) 01:43:26.32
>>381
ああ・・・お前は勉強しなおしたほうがよい

601 :uy:2011/09/29(木) 01:59:33.86
>>598
また理解してない奴が。

C++ → 静的メタ
Lisp → S式

な。

よくわかってないと思うけど、そういうこと。 説明したってどうせお前じゃ無理だ

Haskellなんつうゴミ言語はいらない

あー・・・・ やっぱこのスレ、特定の初心者が名無し粘着してんのかなー
面倒だからコテつけろよカス バカみたいに論外な低スキルの"ごみかす"に1レス消費するのがもったいない

659 :デフォルトの名無しさん:2011/09/30(金) 22:11:30.23
そもそも、なぜ土方や低能は
変数の型宣言を好むのだろうか?

それが分かればこの不毛な論争にも
解決の糸口が見えるかもしれん

662 :デフォルトの名無しさん:2011/09/30(金) 23:05:09.01
>>659
文字列が嫌いなんじゃないの
CUIやプロトコルのような中小零細言語が嫌い

663 :デフォルトの名無しさん:2011/09/30(金) 23:08:11.69
>>659
> そもそも、なぜ土方や低能は
> 変数の型宣言を好むのだろうか?

コーディングというめんどくさくて
つまらない作業を楽にできるから。

668 :デフォルトの名無しさん:2011/09/30(金) 23:12:30.47
>>662>>663
煽りではなく、マジでどう繋がるのか分からないんだけど

695 :デフォルトの名無しさん:2011/10/01(土) 00:33:48.70
モンキーパッチのどこがまともな話なのかw
それこそ下らないだろ。

まあモンキーパッチを実行前に適用する
言語拡張が必要だ。みたいな話なら面白いかもね。

707 :デフォルトの名無しさん:2011/10/01(土) 00:58:39.66
動的言語の代表的機能がeval(モンキーパッチ)なんだけど?

ttp://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E

717 :デフォルトの名無しさん:2011/10/01(土) 01:08:00.31
>>707のリンク先の文章でいえば、
「オブジェクトシステムや型システムの実行時変更」
が動的言語におけるモンキーパッチに該当する

721 :デフォルトの名無しさん:2011/10/01(土) 01:11:34.25
モンキーパッチは、やってることの形容であって、具体的な手法論じゃない。
evalはあくまで具体的な手法。
モンキーパッチをevalで実装してる例はぐぐれば大量に出てくる。
http://www.google.co.jp/search?gcx=c&sourceid=chrome&ie=UTF-8&q=Monkey+patching+eval

723 :デフォルトの名無しさん:2011/10/01(土) 01:13:48.99
>>721
それただの検索クエリーじゃないかw
自分で探してこいよ。まったく行動が糞ガキ全開だなw

745 :デフォルトの名無しさん:2011/10/01(土) 01:57:39.36
js> var x=10;
js> eval("x=20");
20.0
js> java.lang.System.out.println( "x:" + x );
x:20

javascriptなんかは自由にプログラム内の変数にアクセスできるな。

757 :デフォルトの名無しさん:2011/10/01(土) 02:17:42.05
グローバル変数が書き換わることなんて重要じゃないんだがね
ましてやモンキーパッチも大して重要じゃない

動的言語の話としてわな

759 :デフォルトの名無しさん:2011/10/01(土) 02:19:20.04
>>757
だから、俺は>>695の時点でモンキーパッチは動的言語の
話題としては下らないとさっさと切り捨てたんだがw

761 :デフォルトの名無しさん:2011/10/01(土) 02:20:35.85
>>759
じゃ動的言語らしい話題を出せ


766 :デフォルトの名無しさん:2011/10/01(土) 02:23:23.99
>>761
俺は動的言語? ぷwwwの立場だから
出すつもり無いわw

それよりか、現在動的言語でしかできないようなことを
静的言語として実行前に行う言語仕様を考えるほうが興味あるな。

本当に動的言語でやるべきことなんて
実際はかなり少ないと思ってる。

774 :デフォルトの名無しさん:2011/10/01(土) 02:28:47.84
>>766
じゃ「現在動的言語でしかできないようなことを
静的言語として実行前に行う言語仕様」とやらを教えてくれ
妄想でいいから

775 :デフォルトの名無しさん:2011/10/01(土) 02:29:54.46
>>774
すでに書いたけど。

> 696 名前:デフォルトの名無しさん[sage] 投稿日:2011/10/01(土) 00:36:42.61
> たとえばここに、Stringクラスにmy_funcメソッドを追加するモンキーパッチングの例があるけど、
> http://mahata.net/pukiwiki/index.php?%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0
>
> これって別に実行時にやらなくても、
> C#のように、拡張メソッドで実装することが出来る。
> http://www.atmarkit.co.jp/fdotnet/bookpreview/kisokaracs_1101/kisokaracs_1101_01.html
>
> モンキーパッチングの大半はこのように
> 実行前にパッチをあてることが可能だろう。


778 :デフォルトの名無しさん:2011/10/01(土) 02:32:20.86
>>775
そんな下らないことはいいから、ユーザーが書いたプログラムを制御するスクリプトを、
実行中のプログラムが、片安全に読み込んで実行する例とか書いてくれ。

780 :デフォルトの名無しさん:2011/10/01(土) 02:34:03.55
>>778
散々でてますけど。

784 :デフォルトの名無しさん:2011/10/01(土) 02:35:41.61
>>780
どこに?

785 :デフォルトの名無しさん:2011/10/01(土) 02:36:57.66
>>784
evalとsandbox
例外受け取ればもう十分だろ。

788 :デフォルトの名無しさん:2011/10/01(土) 02:44:33.18
>>785
eval ができた時点で動的言語じゃん。
実行時メタプログラミングができたら動的言語だろ。

790 :デフォルトの名無しさん:2011/10/01(土) 02:45:52.41
>>788
JavaでJavaScript動かしたらどうなるの…と。

804 :デフォルトの名無しさん:2011/10/01(土) 10:23:29.77
ユニットテストでモック/スタブを作るときに
モンキーパッチをするのは間違い。

モック/スタブを作るならば、同じインターフェースを
備えたラッパーを作るべき。

中身を見れることに依存すると、中身が見れない、
つまりソースコード非公開ライブラリでは使えない
汎用性のないテクニックになる。


812 :デフォルトの名無しさん:2011/10/01(土) 11:04:56.17
モンキーパッチはもともとゲリラパッチと呼ばれていたことからも解るように、
本当ならやらないほうがいいパッチなんだよ。

もちろん意味が無いテクニックくとは言わない。
だがそれは”普通のコード”で実現できなく、
外部のコードを自分の開発の制御下に
持ってこれない場合に行うもの。

テストなんてのは、自分が開発したコードに対して行うもので、
当然自分の開発の制御下に置くものだし、置けるはずのものなんだから、
そんなどうしようもない場合に用いるテクニックを多用する時点で、
自分が開発したコードがテストがしにくいコードになってると言わざるを得ない。

820 :デフォルトの名無しさん:2011/10/01(土) 12:29:48.12
書き込みから漂う圧倒的な土方臭から
>>812-817が同一人物だと分かる。

821 :デフォルトの名無しさん:2011/10/01(土) 14:00:15.33
>>820
それを言うことは、お前にとって重要だったのか?


http://hibari.2ch.net/test/read.cgi/tech/1316016777/l50人気ブログランキングへ

学ばないブログ
忍者AdMax
記事検索
最新コメント
QRコード
QRコード
  • ライブドアブログ