なぜFORTRANプログラムの関数名が同じではないのですか?私は両方のプログラムで同じ名前を使用しますが、おそらくこれはFORTRANに関連しています。私はあなたがこの答えのために書いたC関数名を使用します、そして、私はこれが初心者のためのかなりの仕事であることに同意します。これは完全な解決策ではありませんが、適切な方向にあなたを導くべきです(うまくいけば)。最初の... Cの配列は、コンパイル時に決定された固定の次元を持ちます。したがって、関数の宣言はコンパイルされません。配列ディメンションパラメータで次元ポインタを逆参照することを意図している場合、実行可能コードではないため、これは機能しません。コンパイルにのみ使用されるパラメータ宣言です。
第2に、呼び出しごとに異なる次元を持つ配列を渡すか、あらかじめ配列内にいくつの要素があるかわからないようです。これを仮定すると、配列のアドレスを渡すだけでよい(次元が常に正しいと仮定して)。あなたの関数のプロトタイプが、その後することができますあなたの関数は(そう、あなたにポインタ演算を表示するには)次のように実装することができ
void cuda_(int *idim, int *jdim, int *kdim, float *U, float* V, float* W);
:もちろん
void cuda_(int *idim, int *jdim, int *kdim, float* U, float* V, float* W)
{
int i, j, k;
// Assuming you want to process each individual array
// items one after the other; this to show pointer arithmetic
for (i=0; i<*idim; i++) {
for (j=0; j<*jdim; j++) {
for (k=0; k<*kdim; k++) {
// Do whatever with the i,j,kth element;
// We assign unique values so you can check
// that this example accesses the right array elements
*(U + i * sizeof(float) + j * sizeof(float) + k) = i + j + k;
*(V + i * sizeof(float) + j * sizeof(float) + k) = 2*i + 2*j + 2*k;
*(W + i * sizeof(float) + j * sizeof(float) + k) = 3*i + 3*j + 3*k;
}
}
}
return;
}
、あなたは徹底的に行うために、この例をテストする必要がありますこれはあなたが実際にやっていることであり、私は3D配列を適切にマップしています(これはFORTRANプログラムに実装されていると仮定して1次元配列にマップしたものです;そうでない場合は、適切なポインタを使用しますが、原則は例と同じです)。私はこのコードの非常に表面的なテストを行い、ポインタの操作は手間がかかりエラーが発生しやすいことに注意してください!がんばろう。
今、これは二次的に重要ですが、私はそのポイントを作るべきだと感じています。私はなぜあなたがポインターとして配列の次元を渡したいか分からない。おそらくそれはFORTRANのための要件です(おそらく、あなたは値/コピーでパラメータを渡すことはできません)。あなたが(参照によってではなく)コピーによってパラメータを渡すことができれば、私は次のように変更を提案:
// Prototype:
void cuda_(int idim, int jdim, int kdim, float* U, float* V, float* W);
// Implementation:
void cuda_(int idim, int jdim, int kdim, float* U, float* V, float* W)
{
int i, j, k;
for (i=0; i<idim; i++) {
for (j=0; j<jdim; j++) {
for (k=0; k<kdim; k++) {
*(U + i * sizeof(float) + j * sizeof(float) + k) = i + j + k;
*(V + i * sizeof(float) + j * sizeof(float) + k) = 2*i + 2*j + 2*k;
*(W + i * sizeof(float) + j * sizeof(float) + k) = 3*i + 3*j + 3*k;
}
}
}
}
プログラミングしていますか? FortranとC、ポインタとmallocを自由に使用できますか?それはたくさんの質問です。 – duffymo
恐らく、http://stackoverflow.com/questions/27582715/passing-a-two-dimentional-array-from-fortran-to-cの複製。 –
あなたがプログラミングに慣れていれば真剣に歩いてジョギングすることができます。選択した言語で引数/パラメータを渡し、次にCとFortranの間でエンティティを渡す方法を学び、CUDAだけをミックスに追加する方法を学びます。これは、長期的には多くの痛みを節約します。 –