T[N]
次のように、シフトの値を制御するブール 1D 配列があります。
**a
: グローバル メモリ内の行列へのポインターの配列。取得するためn*n
に、各行列a
が shift*Identity をサブストラクチャする必要があります。
a=a-shift*eye(n)
私は持っている:
__device__ bool T[N];
__device__ float shift1[N];
__device__ float shift2[N];
__device__ float* a[N];
shift の値は T[i]==true の場合は T によって制御されます => shift=shift1 else shift=shift2;
int tid=threadIdx.x;
if(tid < N){
if(T[tid]){
for (int i=0;i<n;i++){
a[tid][i*n+i]=a[tid][i*n+i]-shift1[tid];
}
}
else {
for (int i=0;i<n;i++){
a[tid][i*n+i]=a[tid][i*n+i]-shift2[tid];
}
}
}
__syncthreads();
これにより、ワープ発散が発生し、コードが遅くなります。上記のループのワープ発散を回避するトリックはありますか?