私は最近、Windows から Linux (Debian、64 ビット) に移行し、GPGPU 開発環境を稼働させようとしているので、Windows で動作するプログラムをテストしています。
コンパイルとリンクはうまくいきますが、プログラムを実行すると奇妙なエラーが発生します。glew と freeglut を使用しています。
最初のスニペット: OpenGL のみ
i = 1;
info = PROGRAM_NAME;
glutInitContextVersion(4,2);
glutInit(&i, &info);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(W_SIZEX, W_SIZEY);
glutInitWindowPosition(W_POSX, W_POSY);
glutCreateWindow(info);
glClearColor(1.0,1.0,1.0,0);
/**/
printf("Before glewInit: %i\n", glGetError());
/**/
printf("glewInit returns: %i\n", glewInit());
/**/
printf("After glewInit: %i\n", glGetError());
/**/
そこから、次の出力が得られます。
Before glewInit: 0
glewInit returns: 0
After glewInit: 1280
これは無効な列挙エラーです。何が原因なのかはわかりませんが、プログラムの実行の後半で発生する次のエラーに関連している可能性があります。
2 番目のスニペット: OpenCL と OpenGL の相互運用
/* BUFFERS */
(*BFR).C[0] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, 0);
(*BFR).C[1] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, &i);
dcl(i);
glGenBuffers(2, (*BFR).G);
glBindBuffer(GL_ARRAY_BUFFER, (*BFR).G[0]);
glBufferData(GL_ARRAY_BUFFER, SI, 0, GL_DYNAMIC_DRAW);
(*BFR).D[0] = clCreateFromGLBuffer(*CTX, CL_MEM_WRITE_ONLY, (*BFR).G[0], &i);
dcl(i);
glBindBuffer(GL_ARRAY_BUFFER, 0);
ここで、dcl(int) メソッドは CL エラー コードをデコードするだけです。これを実行すると、clCreateFromGLBuffer() から CL_INVALID_GL_OBJECT エラーが発生します。ただし、OpenGL には、問題のバッファの生成、バインド、またはバインド解除に関する問題はありません。OpenCL コンテキストは明らかに有効であり、作成またはクエリでエラーは発生しません。すべてが Windows 7 64 ビットの VS2010 で動作します。
コンパイルの詳細
関連するインクルードは次のとおりです。
/* OPENGL */
#include "GL/glew.h"
#include "GL/freeglut.h"
/* OPENCL */
#include "CL/cl.h"
#include "CL/cl_gl.h"
私はGCCを使用しており、次のようにリンクしています:
gcc -w -I./include CLGL.c -o ~/Templates/GOL-CLGL/run/a.out -lGLEW -lGLU -lglut -lGL -lOpenCL;
コンパイルとリンクの結果、エラーは発生しません (ポインターの乱用に関する多くの警告が表示されますが、それが原因であるとは思えません)。
現在、これをデバッグする方法についてのアイデアがありません。誰でもさらなる手順を提案できますか?