前提・実現したいこと
c++でOpenACCを使っています.
こんな感じのN個の成分を持つdouble型の配列pに関してp[0],p[1],...と
並列化していってそれぞれに対して決められた回数だけ1を足し続けるという簡単な動作確認をしています.
ただここでdouble型を使っているはずがint型の境界2147483647を超すとそこでストップしてしまうようです.double型は100桁だろうと問題なく計算できるはずだと認識しており,10^10程度の計算がまさかできないというわけでもないでしょうし,また使用しているCPUやGPUは現行機の中でもスペックは高い方と思われますので処理限界というわけでもなさそうです.
OpenACCなどのGPUプログラミングは倍精度計算には対応していると聞いたはずですが,どうすれば10^10程度の数までの計算を扱えるのでしょうか?
ご指導よろしくお願いします.
該当のソースコード
c++
1#include <iostream> 2#include <string> 3#include <stdint.h> 4#include <vector> 5#include <stdio.h> 6#include <stdlib.h> 7#include <omp.h> 8#include <numeric> 9#include <cmath> 10#include <iostream> 11#include <math.h> 12#include <iomanip> 13#include <fstream> 14#include <sstream> 15#include <algorithm> 16#include <chrono> 17#include <utility> 18#include <time.h> 19#include <tuple> 20#include <cstdint> 21#include <cstdio> 22#include <random> 23 24int N, STEP; 25using namespace std; 26 27int main(int argc, char* argv[]) { 28 cout << "N=?\n"; 29 cin >> N; 30 cout << "STEP=?\n"; 31 cin >> STEP; 32 33double p[N]; 34#pragma acc kernels 35#pragma acc loop independent 36for (long long i = 0; i < N; ++i) { 37 38 for (long long T = 1; T <= STEP; ++T) { 39 p[i]+=1; 40 41 } 42 } 43 44cout<<"p[5]="<<p[5]<<endl; 45}
発生している問題・エラーメッセージ
$ ./a.out N=? 1000 STEP=? 1000 p[5]=1000 ←OK $ ./a.out N=? 10000 STEP=? 20000000 ←OK p[5]=2e+07 $ ./a.out N=? 10000 STEP=? 2900000000 p[5]=2.14748e+09 ←?? $ ./a.out N=? 100 STEP=? 29000000000 p[5]=2.14748e+09 ←?? $ ./a.out N=? 100 STEP=? 2900000000 p[5]=2.14748e+09 ←?? $ ./a.out N=? 100 STEP=? 290000000 p[5]=2.9e+08 ←OK (cout << fixed << setprecision(20);とした場合) ./a.out N=? 5031 STEP=? 9898564565 p[5]=2147483647.00000000000000000000 ←??
補足情報(FW/ツールのバージョンなど)
nvc++ 20.9-0
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
tesla V100
Xeon
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/08 11:39