フラット化された 2D マトリックスを共有メモリにロードし、x に沿ってデータをシフトし、y にも沿ってシフトしながらグローバル メモリに書き戻そうとしています。したがって、入力データは x と y に沿ってシフトされます。私が持っているもの:
__global__ void test_shift(float *data_old, float *data_new)
{
uint glob_index = threadIdx.x + blockIdx.y*blockDim.x;
__shared__ float VAR;
__shared__ float VAR2[NUM_THREADS];
// load from global to shared
VAR = data_old[glob_index];
// do some stuff on VAR
if (threadIdx.x < NUM_THREADS - 1)
{
VAR2[threadIdx.x + 1] = VAR; // shift (+1) along x
}
__syncthreads();
// write to global memory
if (threadIdx.y < ny - 1)
{
glob_index = threadIdx.x + (blockIdx.y + 1)*blockDim.x; // redefine glob_index to shift along y (+1)
data_new[glob_index] = VAR2[threadIdx.x];
}
カーネルへの呼び出し:
test_shift <<< grid, block >>> (data_old, data_new);
およびグリッドとブロック (blockDim.x はマトリックス幅、つまり 64 に等しい):
dim3 block(NUM_THREADS, 1);
dim3 grid(1, ny);
私はそれを達成することができません。誰かがこれのどこが悪いのか指摘してもらえますか? ストライド インデックスまたはオフセットを使用する必要がありますか?