2

テスト用にこの単純なカーネルがあります。

__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);
4

1 に答える 1