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

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

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

OpenCLは、システム上にある多くの計算資源を統一して扱うためのAPIセット。CPU/GPU/DSP/FPGAなどの異種混在環境(ヘテロジニアス・システム)で並列処理を用いるプログラム作成のためのフレームワークです。

Q&A

解決済

2回答

216閲覧

OpenCL Intel CPU内蔵グラフィックスでコンパイルが失敗する

cure_fontaine

総合スコア137

OpenCL

OpenCLは、システム上にある多くの計算資源を統一して扱うためのAPIセット。CPU/GPU/DSP/FPGAなどの異種混在環境(ヘテロジニアス・システム)で並列処理を用いるプログラム作成のためのフレームワークです。

0グッド

0クリップ

投稿2024/02/02 06:26

編集2024/02/02 06:30

実現したいこと

OpenCLで並列処理のカーネルをプログラムしています。
コンピューターに見つかった並列処理デバイスはIntel HD Graphics 4000 と、 Core(TM) i7-3540M CPU の2種類です。
グラボは使用していません。
プログラムのコンパイルは、動作ターゲットがi7CPUの場合は問題無く成功しますが、同じプログラムコードなのにターゲットをIntel HD Graphicsにするとエラーが出ます。
↓コンパイルエラーのメッセージ
fcl build 1 succeeded.
fcl build 2 succeeded.
Error: internal error.

これでは、どの行にエラーの原因があるか分かりません。
カーネルのソースコードは135行、文字数で約4,000文字あります。
ソースコードを半分に減らしてテストするとコンパイルが通ることから、ソースコードの容量がエラーに関係していると思われます。
但し、この程度の容量では、現在設計しているプロジェクトが実現できません。(ソースコードに盛り込みたいことは、この8倍は必要です。)

OpenCL バージョンは1.2です。
教えていただきたいことは、
(1)このエラーの原因
(2)動作ターゲットがIntel HD Graphicsの場合の、ソースコードの限界容量や、処理の複雑さの限界はどのように定められているのか知りたいです。

よろしく御回答をお願いします。

なお、解決に向けてネットで検索しましたが、有用な情報は見つかりませんでした。

発生している問題・分からないこと

記載済みです。
ーーーーーーーーーーーーーーーーー

エラーメッセージ

error

1記載済みです。 2ーーーーーーーーーーーーーーーーー

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

記載済みです。
ーーーーーーーーーーーーーーーーー

補足

特になし

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

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

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

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

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

cure_fontaine

2024/02/02 06:56

ありがとうございました。リンク先の内容を今読み終わりました。 if文での&& を &に変えることでも改善されると書かれています。来週に実験してみます。
cure_fontaine

2024/02/05 03:30

エラー発生行を集約できました。 __kernel void myKernelFunction( __global int4* buf1) { int r1[4000]; int r41[4000],r42[4000]; // r1[0]=1; r41[0]=2; r42[0]=7; //これを入れるとInternal errorは出なくなる if (1==1){buf1[0]=(int4)(0,r41[0],r42[0],r1[0]);} } ソースコードの容量オーバーが原因ではありませんでした。 推測ですが、定義後未使用の配列要素が不確定値になっていると、グローバルメモリーへの格納でエラーが出るようです。 上記 if (1==1){buf1[0]=(int4)(0,r41[0],r42[0],r1[0]);} でint4型を使っているのは、エラーを出しやすくするためです。intではエラーの発生確率は減ります。コンピューターの違いにより、エラーの発生確率は変わると思います。 これから解決方法を考えますが、配列は初期化するとか、配列の添字が未格納の要素番号を指すのを防止するなどの方法を候補に挙げています。
umimi

2024/02/08 20:54

C/C++ で、スタックから、そんな、でかい配列を取っては、いけません。 malloc とか new を使いましょう。
cure_fontaine

2024/02/08 22:33

OpenCLのカーネルのコンパイルで、「CPU内蔵グラフィックスでコンパイルが通らず、CPUでは通る」という問題とスタックの使用が関係あるのですか。 上のソースコードはC/C++ではありません。OpenCL C です。mallocやnewは使用できません。
umimi

2024/02/09 11:54

C 言語の OpenCV ライブラリじゃないんですか ? malloc 使えるはずですが。 あ、OpenCV じゃなくて、OpenCL か。 Cuda だと cudaMalloc というのがある。 https://qiita.com/mizunomi32/items/acabf189bf844764b275 OpenCLでGPUをブン回してみた - Qiita(ja) ホストコード(CPU)方で malloc して、それをカーネルコード(GPU)に渡しているようです。
guest

回答2

0

自己解決

質問をクローズします。
今回、この問題の解決は行いません。
CPU 内蔵グラフィックスでのコンパイルが通らないだけなので、開発はCPU i7で継続します。
コンパイルが通らない原因も、多くの要素が絡み合っているように見え、このCPUのドライバー自体のバグの可能性もあります。(旧式のCPUであり、ドライバーも完全なものではないというネット上の情報もあり)
ほかのGPGPU関連の解決法も考えますし、いずれ開発用コンピューターも新型に変えます。

投稿2024/02/07 22:39

cure_fontaine

総合スコア137

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

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

0

ソースコードを半分に減らしてテストするとコンパイルが通ることから、ソースコードの容量がエラーに関係していると思われます。

『ソースコードの容量がエラーに関係している』可能性は、低いです。半分にしたソースコードに問題がある可能性が大きいです。例えば、コピーミス等で、綴りが正しくないなど。

一番いいのは、元のソースコードを貼り付ける事です。書き込み制限に引っかかるなら、teratail でないサービスに、『teratail の書き込み制限に引っかかった』と明記しましょう。

投稿2024/02/04 00:42

umimi

総合スコア517

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

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

cure_fontaine

2024/02/04 22:43

申し訳ありませんが、機密性の高いプロジェクトを遂行していますのでソースコードは公開できません。 この中に、過去に誰も公開していないようなOpenCLの独自運用技術が詰め込まれているんです。
umimi

2024/02/04 23:49

では、ワシからのアドバイスは、これ以上できませんので、他の方、お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問