一个CUDA程序在主机端和设备端不同结果

我编了这样一个程序,最开始64个元素的数组初始值全为1,目的是将64个元素的数组中以2、3交替作为该数组数据,但是我在设备端显示的时候在0-31号线程下是2、3交替,但其后就全部是1。然后我将该数组传回主机端显示的时候则数组中64个元素按2、3交替存放的。不知道是什么原因??请高手指教一下。谢谢了!!

非常感谢
zhongliangv External Media (UID: 25720864)
希望以后还能得到您的指导,谢谢!!

// includes, system
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
// includes, project
#include <cufft.h>
#include <cutil_inline.h>
#include "cuPrintf.cuh1"

#define size 64

__global__ void my(int *da)
{
int tid=threadIdx.x;
int Ns,p,q;
if(tid<32) //取了线程的一半,因为在一个线程的条件下,可以提取到数组两个 //下标,就正好取到了整个数组
for(Ns=1;Ns<2;Ns=Ns<<1)
{ p=tid/Ns*Ns*2+tid%Ns;
q=p+Ns;
da[p]=da[p]+1;
da[q]=da[q]+2;
__syncthreads();
}
//cuPrintf("%d\n",da[tid]);
}


int main()
{ int i;
int *h_data1=(int*)malloc(sizeof(int) * size);
int *h_result1=(int*)malloc(sizeof(int) * size);
for ( i =0; i <size; i++) 
{ 
h_data1[i]=1;
}
int * d_data1;
cutilSafeCall(cudaMalloc((void**)&d_data1, sizeof(int)*size));
cutilSafeCall(cudaMemcpy(d_data1, h_data1,sizeof(int)*size,
cudaMemcpyHostToDevice));
cudaPrintfInit();
my<<<1,size>>>(d_data1);
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
cutilSafeCall(cudaMemcpy(h_result1, d_data1,sizeof(int)*size,
cudaMemcpyDeviceToHost));

for(i=0;i<size;i++)
printf("i=%d:%d\n",i,h_result1[i]);
}

0-31号线程是想要的结果,会不会是warp之间哪里没有考虑到啊?

24行,你将同步__syncthreads放在if条件外面,不要放在里面,同步是同步block内的所有线程,不能放在条件中的,否则可能出现意想不到的隐藏错误,因为有些线程无法执行条件内的同步。