構造体の配列を引数としてカーネルに渡すと、最初の項目 (array[1]、array[2] など) の後に奇妙な値が得られます。多分アライメントの問題のようですか?
構造体は次のとおりです。
typedef struct Sphere
{
float3 color;
float3 position;
float3 reflectivity;
float radius;
int phong;
bool isReflective;
} Sphere;
ホスト側の初期化コードは次のとおりです。
cl::Buffer cl_spheres = cl::Buffer(context, CL_MEM_READ_ONLY, sizeof(Sphere) * MAX_SPHERES, NULL, &err);
err = queue.enqueueWriteBuffer(cl_spheres, CL_TRUE, 0, sizeof(Sphere) * MAX_SPHERES, spheres, NULL, &event);
err = kernel.setArg(3, cl_spheres);
何が起こるかというと、配列内の 2 番目の Sphere 構造体の色は、実際には、ホスト側 (s3 または z) で色を設定した最後の値、初期化されていないゼロの値、および設定したものの最初の値を持つことになります。ホスト側 (s0 または x) に配置します。float3 データ型には、実際にはまだ初期化されていない 4 番目の値 (s3) があることに気付きました。初期化されていないゼロ値の由来はそこにあると思います。したがって、それはアライメントの問題のようです。私はそれを修正するために何ができるかについて本当に途方に暮れています。誰かがこの問題に光を当てることができるかもしれないと思っていました。構造体の定義が両側でまったく同じであることを確認しました。