Linux下,cuda编写的计算pi的程序 的问题

就是大力水手 2011-07-18 11:17:21
在Linux下用写了个程序计算pi:
#include "stdio.h"
#define N 100000

__global__ void compute(float *res,int num){
int id=threadIdx.x;
if(id<num){
float count=0;
for(int s=id;s<N;s=s+num){
float temp=1.0+((s+0.5)/(float)N)*((s+0.5)/(float)N);
float temp2=4.0/(float)N/temp;
count=count+temp2;
}
res[id]=count;//保存每个线程计算的结果
}

}//这是计算pi的kernel函数
int main(){
const int threadnum=10;
float res[threadnum]; float host_res[threadnum];
cudaMalloc((void**)&res,sizeof(float)*threadnum);
compute<<<1,threadnum>>>(res,threadnum);
cudaMemcpy(host_res,res,sizeof(float)*threadnum,cudaMemcpyDeviceToHost);
float result=0;
for(int i=0;i<threadnum;i++)
result=result+host_res[i];

printf("the result is %f\n",result);

return 0;

}

1、这样总不对,每次跑出来的结果都乱七八糟的,不一定是啥。可是如果把红色的部分改成:float *res;就对了。想请教大家一下,这是为什么呀?
2、nvcc编译的时候报Warning:ptxas /tmp/tmpxft_00006f31_00000000-2_pi.ptx, line 73; warning : Double is not supported. Demoting to float可是程序里确实用的都是float,没用double,这个warning又是咋回事呀?

小弟初学,很多都不懂,先谢谢大家啦!
...全文
860 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
linxxx3 2011-07-20
  • 打赏
  • 举报
回复
第一个问题,res数组应该开在显存的地址空间里,声明静态数组的方式不能支持。
第二个,首先你的显卡应该不支持double类型,计算的中间结果有double,可能是 s+0.5 ,整型和float运算按C标准会都转double运算,但是卡不支持,所以截断为float。看你的程序应该不会对结果有影响,这个warning不用管
就是大力水手 2011-07-20
  • 打赏
  • 举报
回复
哦~~soga!谢谢!
就是大力水手 2011-07-18
  • 打赏
  • 举报
回复
麻烦大家帮忙看看啦~~程序很简单,就是求pi,而那个诡异的问题我真不知道怎么回事了……

374

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Linux
社区管理员
  • CUDA on Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧