質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

並列処理

複数の計算が同時に実行される手法

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

965閲覧

OpenACCで2次元配列と構造体配列の受け渡しができません

Kinsho

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

並列処理

複数の計算が同時に実行される手法

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/29 06:43

編集2020/11/01 11:37

前提・実現したいこと

運動シミュレーションをOpenACCで並列化を試みています.

単純な並列化

c++

1 2double p=0; 3for(lon long i=0;i<10000000000;i++){ 4p+=1; 5} 6cout<<p;

では処理時間短縮が確認され動作環境には問題ないようですが,csvから作った2次元ベクトルの成分や構造体配列参照しようとするとエラーを返されてしまいます.
例として以下のようなコードを考えます.
構造体配列のa[0]の成分p.vxに並列化してひたすらBr[4][4]を足し続けるだけの至ってシンプルな内容です.

データ移動ができていないのかなと思い,こちらの記事を参考にcopyinやpresentなどいろいろ試しましたが結果は変わりませんでしたし,そもそもGenerating implicit copy(Br,a)と書かれているのでそれも関係なさそうです.

ご教示よろしくお願いします.

補足情報(FW/ツールのバージョンなど)

GPUはnvidiaのtesla,nvc++は最新版にしてあります.
コンプラ絡みの諸事情で解決後に質問文は大幅編集しました。ご容赦ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

色々試した結果vector型が対応していないようです.
a[]とかa[][]みたいのは通って計算結果確認もできたので,うまい方法が分かるまではそちらで代用します

投稿2020/11/01 11:31

Kinsho

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

警告は知りませんけど、Segmentation faultの方は

int N; //静的寿命の変数なので初期値0

vector<agent> a(N);//Nには特に値が与えられて無いので0
であれば
a[0].p.vxにアクセスしようとしたら破綻するような気がします。

C++

1#include <vector> 2int N; 3struct coordinate { 4 double x; 5 double y; 6 double z; 7 double vx; 8 double vy; 9 double vz; 10}; 11 12struct agent { 13 int category; 14 struct coordinate p; 15};//categoryとxyz方向の6成分を表す構造体 16 17int main() { 18 std::vector<agent> a(N); 19 a[0].p.vx=100; 20 return 0; 21}

これで再現。


質問が変わっちゃって、全然知らない分野に突入しそうだけど...

そもそも

C++

1 a[0].p.vx=0; 2 for(long long i=0;i<100;i++){ 3 a[0].p.vx+=Br[4][4]; 4 }


a[0].p.vx+=Br[4][4]*100;
と等価ではないのですか?
等価なら並列で計算する意味はなさそうだし、等価でない状況なら並列計算が成り立たないのでは。

投稿2020/10/31 23:35

編集2020/11/01 02:55
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kinsho

2020/11/01 00:25

質問前に慌てていてつい誤った文をコンパイルしていました. エラー文とともに訂正いたしましたのでよろしくお願いします.
Kinsho

2020/11/01 08:40 編集

そうですね.ただこれはサンプルとして作っただけで,実際はいろんなデータを大量に足し合わせるイメージです. 元のコードをそのまま掲載すると1000行超えてて誰も読まないと思うので...
Kinsho

2020/11/01 08:39 編集

また等価でない状況がーとの懸念ですが,一番上に掲載したようなひたすら1を足し合わせるやつを10^13回でやってみても1秒以内で終わったので内部でうまく並列化してくれているようです.(並列化したやつを最後に足し合わせているとかだと思います)
thkana

2020/11/01 10:13 編集

> サンプルとして作っただけで サンプルとして役に立っていないのでは... 並列計算に詳しくないのですが p=p+1 みたいに、これまでの結果が今回の演算に影響するようなものはそもそも並列計算に出来ないと思うのだけれど。n回めの計算とn+1回めの計算が独立だから並列化できるんじゃないのですか? (これぐらい簡単に論破出来ないようだったらちょっと苦しいんじゃないかと思う。急いでいるなら相手しなくていいですけれど)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問