非同期 PSO を実装しようとしています。これを行うための私のアプローチは次のとおりです。
__global__ void particle(double *pos, double *pbest, double *vpbest, double *vel, double *gbest){
int thread = threadIdx.x + blockDim.x * blockIdx.x;
int particle, i = 0;
double tpbest;
double l, r;
int index, best, j;
if(thread < DIMPAR){
particle = thread / NDIM;
do{
best = ring(vpbest, &particle);
index = (best * NDIM) + (thread % NDIM);
l = (double) 2.05 * (double) uniform(thread) * ( pbest[thread] - pos[thread] );
r = (double) 2.05 * (double) uniform(thread) * ( pbest[index] - pos[thread] );
vel[thread] = vel[thread] + l + r;
pos[thread] = pos[thread] + vel[thread];
__syncthreads(); // I am trying wait all threads write in global memory
if( (thread % NDIM) == 0 ){ //only one thread replace the vector
tpbest = rastrigin(pos, particle * NDIM, NDIM);
if(tpbest < vpbest[particle]){
vpbest[particle] = tpbest;
for(j = 0 ; j < NDIM; j++){
pbest[(particle * NDIM) + j] = pos[(particle * NDIM) + j];
}
}
}
i++;
}while(i < 10000);
}
}
呼び出し:
particle<<<1,512>>>(d_pos, d_pbest, d_vpbest, d_velo, d_gbest);
場合によっては、同期に問題が発生することがあります... pos[thread] の一部の値が発散します。セクション B.6 CUDA_C_PROGRAMMING GUIDE:
スレッド ブロック内のすべてのスレッドがこのポイントに到達し、__syncthreads() の前にこれらのスレッドによって行われたすべてのグローバルおよび共有メモリ アクセスが、ブロック内のすべてのスレッドから見えるようになるまで待機します。
pos ベクトルは次のようになります。
p0 = [0,1,2] //粒子 1
p1 = [3,4,5] //粒子 2
p2 = [6,7,8] //粒子 3
pos = [1,2,3,4,5,6,7,8] //pos ベクトル、DIMPAR = 9; NPAR = 3; NDIM = 3
NDIM >= 30 を使用すると、発散が発生します
グローバルメモリを使用して同期を確実にする方法は?