0

私は現在、奇妙な動作に遭遇した OpenCL プロジェクトに取り組んでいます。

AMD アプリ SDK: OpenCL v1.2 HD 7770

カーネルは次のとおりです。おそらく、想像できる最も単純なものです。

__kernel void bm_and(
__global const unsigned int* const bitmap1,
__global const unsigned int* const bitmap2,     
__global unsigned int* const result ) 
{   
    size_t gi = get_global_id(0);   
    if (gi >= get_global_size(0))       
        return;     
    result[gi] = bitmap1[gi] & bitmap2[gi];  
}

私が抱えている問題は、カーネルを呼び出すグローバルサイズがどれほど大きくても、その後のclFinishへの呼び出しで約1.5秒の一定の遅延があるように見えることです。

これは bm_and への最初の呼び出しでのみ発生し、それ以降の呼び出しは通常のパフォーマンスで動作します。

抽象的な例

//time ~1.5s (doesn't matter if bitmaps are 1 or 100M)
clFinish(queue)
start = now
bm_and(x,y,z)
clFinish(queue)
end = now
time = end-start

//time ~1.5s, second kernel call and clFinish execute at a high performance+
clFinish(queue)
start = now
bm_and(x,y,z)
clFinish(queue)
bm_and(x,y,z)
clFinish(queue)
end = now

遅延は使用するビットマップのサイズとは無関係であり、データは既にデバイス上にあるため、転送コストはおそらく問題ではありません。

編集:
カーネルのパフォーマンス自体は問題ではないようです。送信してからカーネルを起動するまでに時間がかかるようです。

これらは出力例です

clGetEventProfilingInfo

QUEUE  MS: 5497240.33
SUMBIT MS: 5497240.36
START  MS: 5498938.58
END    MS: 5498938.94
4

0 に答える 0