我模拟的数据量可能有点大,共享存储器不够,所以我想分block导入,逐个计算。。
目前还只是分两个block也就是分两次导入,第一次导入的时候数据和从内存拷贝到显存的一致,但是第二次导入的时候就有问题了,数据发生了变化。。
首先是global里面的第二次的数据就不对了,其次是第二次拷贝到共享存储器的又和第二次global里的的不一样
代码如下,还望帮忙看看啊,我找不到什么问题。。。
__global__ static void GPU(float4* pos,float4* vel,int n)
{
__shared__ float4 Sh_pos[N];//added
__shared__ float4 Sh_vel[N];//added
const int tid=threadIdx.x;
const int bid=blockIdx.x;
const int gtid=bid*blockDim.x+tid;
float3 acc = {0.0f, 0.0f, 0.0f};
float4 myPosition = pos[gtid];
int i,tile;
for (i = 0, tile = 0; i < n; i += blockDim.x, tile++)
{
int idx = tile * blockDim.x + threadIdx.x;
Sh_pos[threadIdx.x] = pos[idx];
Sh_vel[threadIdx.x] = vel[idx];
//Sh_pos[threadIdx.x].x = pos[idx].x;
//Sh_pos[threadIdx.x].y = pos[idx].y;
//Sh_pos[threadIdx.x].z = pos[idx].z;
//Sh_vel[threadIdx.x].x = vel[idx].x;
//Sh_vel[threadIdx.x].y = vel[idx].y;
//Sh_vel[threadIdx.x].z = vel[idx].z;
__syncthreads();
int j=threadIdx.x;
printf("%d--global--%f--%f--%f\n",j,pos[j].x,pos[j].y,pos[j].z);
//从这一句输出显存里的数据,
printf("%d--shared--%f--%f--%f\n",j,Sh_pos[j].x,Sh_pos[j].y,Sh_pos[j].z);
//从这一句输出共享存储器里面的数据,
acc = calculate(myPosition, Sh_pos,acc, n);//****************************edit
__syncthreads();
}
第一次数据的截图[attach]663169[/attach]
第二次数据[attach]663170[/attach]
[ 本帖最后由 hnuzhoulin 于 2010-5-5 20:37 编辑 ]