【发布时间】:2015-12-10 09:13:08
【问题描述】:
我有布尔一维数组T[N] 控制移位值,如下所示:
**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控制 如果 T[i]==true => shift=shift1 否则 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();
这将导致扭曲发散并减慢我的代码。是否有避免上述循环的扭曲发散的技巧?
【问题讨论】:
-
感谢您的评论..我是初学者,我怀疑我是否能理解汇编代码..我认为如果我们在 if-then-else 语句中使用条件分支会自动发生扭曲分歧即,如果单个经纱中的某些线程评估为“真”而其他线程评估为“假”