0

GPGPU メモリが許す限り多くのstruct Thingを割り当て、すべてのstruct Thingに対してカーネルを呼び出す必要があります。

OpenCL では、すべてのCL_DEVICE_GLOBAL_MEM_SIZEメモリを一度に割り当てることはできません。単一の割り当てごとに最大でCL_DEVICE_MAX_MEM_ALLOC_SIZEを割り当てることができます。2 つ目は通常、すべてのメモリの 4 分の 1 です。そこで、4 つのバッファーを作成することにしました。

また、両方の OpenCL カーネル内でポインタへのポインタを使用することはできず、引数をホストからカーネルに渡すときにも使用できないため、バッファの配列をカーネルに渡すことはできません (すべてのバッファは配列内の最初のstruct Thingへのポインタであるため)。

これまでのところ、私のカーネルコードは次のようになっています:

kernel void workWithThings(
    constant uint64_t t1Count,
        global struct Thing * t1,
    constant uint64_t t2Count,
        global struct Thing * t2,
    constant uint64_t t3Count,
        global struct Thing * t3,
    constant uint64_t t4Count,
        global struct Thing * t4
)
{
    private ulong gid = get_global_id( 0 );
    private struct Thing * t;
    if ( gid > t1Count )
    {
        gid -= t1Count;
        if ( gid > t2Count )
        {
            gid -= t2Count;
            if ( gid > t3Count )
            {
                gid -= t3Count;
                t = & t4[ gid ];
            }
            else
            {
                t = & t3[ gid ];
            }
        }
        else
        {
            t = & t2[ gid ];
        }
    }
    else
    {
        t = & t1[ gid ];
    }

    //do the actual work:
    //t->...
}

これは本当にそれを行う唯一の方法ですか?このようなコードを書くのは非常にばかげていると感じます。助けてください。

4

0 に答える 0