C++ CUDA中带和归约的第二循环迭代

C++ CUDA中带和归约的第二循环迭代,c++,cuda,iteration,C++,Cuda,Iteration,我必须将这段代码从c++并行化到CUDAC 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]/den

我必须将这段代码从c++并行化到CUDAC

  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];
        }
这些尝试使我在C++代码和代码CUDA之间得到不同的结果。如果不是U[i],我就放了一个常数!p> 你有什么办法帮我吗


谢谢。

看起来您可以通过

for(iwin = 0; iwin<numwin; iwin++){
    denwham += numbinwin[iwin] / g[iwin] * exp(F[iwin]); 
}
for(ihist = 0; ihist < numhist; ihist++){ 
    Punnorm[ihist] = numwham[ihist] / denwham * exp(U[ihist]);
}

for(iwin=0;iwinTry使用expf尝试增加程序的最小计算能力hi,我也使用了expf,但它不起作用,因为它加载U[I]的值如果你使代码瘫痪,它将无法行走。:pHi sgar91,你可以为我提供一个代码解决方案?H,但我如何移动exp的I列表(U[ihist])在cuda中?按线程分块,内核内部为?您可以使用两个内核或推力,以使您的生活更轻松。您可能会有一些想法在同一个内核中完成所有操作?如果在单个内核中执行此操作,性能将很差,因为您会减少
numhist
次数,这是不必要的。好的,我知道,您打算下载结果吗并将其发送到只处理iList的新内核?
 int smem_sz = (256)*sizeof(float);
  dim3 Block(numhist,numhist,1);
  NewProbabilitiesKernel<<<Block,256,smem_sz>>>(...);
a) loop for/while inside the kernel that iterates over U 
b) iterate by thread
c) iterate to block
for(iwin = 0; iwin<numwin; iwin++){
    denwham += numbinwin[iwin] / g[iwin] * exp(F[iwin]); 
}
for(ihist = 0; ihist < numhist; ihist++){ 
    Punnorm[ihist] = numwham[ihist] / denwham * exp(U[ihist]);
}