このコードを c++ から CUDA C に並列化する必要があります
for(ihist = 0; ihist < numhist; ihist++){
for(iwin = 0; iwin<numwin; iwin++){
denwham[ihist] += (numbinwin[iwin]/g[iwin])*exp(F[iwin]-U[ihist]);
}
Punnorm[ihist] = numwham[ihist]/denwham[ihist];
}
CUDA C では、sum reduction を使用します。
extern __shared__ float sdata[];
int tx = threadIdx.x;
int i=blockIdx.x;
int j=blockIdx.y;
float sum=0.0;
float temp=0.0;
temp=U[j];
if(tx<numwin)
{
sum=(numbinwin[tx]/g[tx])*exp(F[tx]- temp);
sdata[tx] = sum;
__syncthreads();
}
for(int offset = blockDim.x / 2;offset > 0;offset >>= 1)
{
if(tx < offset)
{
// add a partial sum upstream to our own
sdata[tx] += sdata[tx + offset];
}
__syncthreads();
}
// finally, thread 0 writes the result
if(threadIdx.x == 0)
{
// note that the result is per-block
// not per-thread
denwham[i] = sdata[0];
for(int k=0;k<numhist;k++)
Punnorm[k] = numwham[k]/denwham[k];
}
そして、次のように初期化します。
int smem_sz = (256)*sizeof(float);
dim3 Block(numhist,numhist,1);
NewProbabilitiesKernel<<<Block,256,smem_sz>>>(...);
私の問題は、を使用して U を反復処理できないことですexp
。次のことを試しました。
a) loop for/while inside the kernel that iterates over U
b) iterate by thread
c) iterate to block
これらすべての試みにより、C++ コードとコード cuda の間で異なる結果が得られました。U [i] の代わりに定数を配置すると、コードは正常に動作します!
私を助ける考えはありますか?
ありがとう。