1

使用可能な共有メモリを 16384 バイトと報告する GTX9800 を使用しています

次のカーネル コードを指定して、T = int (4 バイト) で実行します。

template <typename T>
__global__ void foo(unsigned n, T *x)
{
    unsigned idx    = blockIdx.x * blockDim.x + threadIdx.x;
    __shared__ T sx[4096];
    x[idx] = 0;
}

期待される結果が得られます。つまり、最初はゼロではない配列 x がゼロで埋められます。

ただし、何もしないコード行を追加します。

template <typename T>
__global__ void foo(unsigned n, T *x)
{
    unsigned idx    = blockIdx.x * blockDim.x + threadIdx.x;
    __shared__ T sx[4096];
    sx[0] = 0;
    x[idx] = 0;
}

カーネルを呼び出した後、x にはゼロがまったく含まれなくなりました。

ただし、sx のサイズを <= 4088 に変更すると、期待どおりの結果が得られます。

どうしたの?私はかなり混乱しています。

編集:

タイプミスの修正: 16384 "KB" を "bytes" に変更

4

1 に答える 1