《cuda並行程序設計》勘誤(2)

注:本人代碼是對長度爲1024的數組排序; block數量爲1,threads數量爲256

p135頁代碼應改爲:

__device__ void merge_array(u32 *src,u32 *dest,u32 num_lists,u32 num_elements,u32 tid){
	u32 reduction_shift=3;
	u32 reduction_size=8;
	u32 per_list=num_elements/num_lists;
	u32 data=src[tid*per_list];
	u32 s_idx=tid>>reduction_shift;
	u32 num_reductions=num_lists/reduction_size;
	__shared__ u32 list_index[256];
	list_index[tid]=0;
	__shared__ u32 min_val[32];
	__shared__ u32 min_tid;
	for(u32 i=0;i<num_elements;i++){
		if(tid<num_lists){
			min_val[s_idx]=0xFFFFFFFF;
			min_tid=0xFFFFFFFF;
		}
		__syncthreads();
		atomicMin(&min_val[s_idx],data);
		if(num_reductions>0){
			__syncthreads();
			if(tid<num_reductions)
				atomicMin(&min_val[0],min_val[tid]);
			__syncthreads();
		}
		if(min_val[0]==data)
			atomicMin(&min_tid,tid);
		__syncthreads();
		if(tid==min_tid){
			list_index[tid]++;
			dest[i]=data;
			if(list_index[tid]<per_list)
				data=src[tid*per_list+list_index[tid]];
			else
				data=0xFFFFFFFF;
		}
		__syncthreads();
	}
}

(在gtx970上此代碼沒有純使用atomicMin()(即不採用規約)的算法快,餘竊以爲是因爲在新的設備上256個線程的線程競爭規模能很好的處理,而此算法用到了多次線程同步,從而拖慢了速度)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章