テスト用にこの単純なカーネルがあります。
__kernel void nfa(__global const int *a, __global int *output)
{
output[0] = a[0];
}
注: これは CPU 上で実行されており、メモリはおそらくホスト上にあります。このエラーが発生します。
* glibc が検出されました./program: malloc(): smallbin 二重リンク リストが壊れています: 0x0000000000a4a540 * *
ホストメモリにアクセスしているため、プログラムの一部が破損していると思われます。しかし、私が知る限り、すべてのメモリが正しく割り当てられています。スタック上にありますが、実行中はスコープ内に留まります。
ただし、これを行うと:
__kernel void nfa(__global const int *a, __global int *output)
{
a = a;
output[0] = a[0];
}
これは答え 2 になります。a は [2, 4, 8] の配列であるため、これは正しいです。
自己への割り当てにより問題が修正されました...
これも問題なく、結果は 4 です。
__kernel void nfa(__global const int *a, __global int *output)
{
output[0] = a[1];
}
自己に割り当てずに a[0] にアクセスするだけで問題が発生するようです。
誰が何が起こっているのか知っていますか?
AMD OpenCLドライバーを搭載したLinuxを使用しています(インテルCPUを搭載していますが、AMDカードを持っています)。
編集:
バッファが作成されるコード(要約すると、配列とバッファの間に他のコードがあります):
int a[3];
a[0] = 2;
a[1] = 4;
a[2] = 8;
cl::Buffer bufferA = cl::Buffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR , sizeof(int) * 3, &a);