我想使用CUDA实现MonteCarlo。
我使用Visual Studio2012 / CUDA 5.5 / GT 720M在Win8 PC上编写代码,运行良好。
然后我尝试在REHL5.3 / Tesla C1060 / CUDA 2.3中编译我的代码,但结果错了。
然后我想用cuda-gdb来调试它
但是,当我编译我的代码时:
nvcc -arch=sm_13 -o my_program my_program.cu
结果是错误的。 但是我无法调试它,因为它不是可调试的代码。
当我像这样编译它时:
nvcc -g -G -arch=sm_13 -o my_program my_program.cu
结果,这一次,正确 ...... 所以我仍然无法通过调试来找到我的错误......
代码如下所示,函数__device__ double monte_carlo_try()
不在实际代码中。
问题是,如果我检查test []的值,我发现值都是正确的。
所以减少部分应该有一些错误。
#include<stdio.h>
#include<cuda_runtime.h>
#include<device_launch_parameters.h>
#include<cuda.h>
#include<malloc.h>
#include<time.h>
#define B 4 //block number
#define T 4 //number of threads per block
#define P 4 //number of paths per thread
__device__ float monte_carlo_try()
{
return 3.0;
}
__global__ void monte_carlo(float*test, float*result)
{
int bid=blockIdx.x;
int tid=threadIdx.x + blockIdx.x * blockDim.x;
int idx=threadIdx.x;
__shared__ float cache[T];
cache[idx]=0;
float temp=0;
for(int i=0;i<P;i++)
{
temp+=monte_carlo_try(); //monte_carlo_try: __device__ function do monte carlo test
}
cache[idx]=temp;
test[tid]=cache[idx];
__syncthreads();
//result[] is the output, and I use test[] to check whether I have got the right cache[idx]
//and the value of test[] is same with what I expect
int i=blockDim.x/2;
while(i>0)
{
if(idx<i)
cache[idx]+=cache[idx+i];
__syncthreads();
i/=2;
}
result[bid]=cache[0];
}
int main()
{
void check_err(cudaError_t );
cudaSetDevice(0);
cudaError_t s_flag;
float *dev_v;
float *dev_test;
s_flag=cudaMalloc((void**)&dev_v,B*sizeof(float));
check_err(s_flag);
cudaMalloc((void**)&dev_test,B*T*sizeof(float));
check_err(s_flag);
monte_carlo<<<B,T>>>(dev_test,dev_v);
s_flag=cudaGetLastError();
check_err(s_flag);
float v[B];
float test[B*T];
s_flag=cudaMemcpy(v,dev_v,B*sizeof(float),cudaMemcpyDeviceToHost);
check_err(s_flag);
s_flag=cudaMemcpy(test,dev_test,B*T*sizeof(float),cudaMemcpyDeviceToHost);
check_err(s_flag);
float sum=0;
for(int i=0;i<B;i++)
{
sum+=v[i];
}
printf("result:%f\n",sum/(B*T*P));
for(int i=0;i<B*T;i++)
{
printf("test[%d]=%f\n",i,test[i]);
}
cudaFree(dev_v);
cudaFree(dev_test);
return 0;
}
void check_err(cudaError_t f)
{
if(f != cudaSuccess)
printf("error msg:%s\n",cudaGetErrorString(f));
}
答案 0 :(得分:1)
您可能在main()
中指明这一行:
cudaMalloc((void**)*dev_test,B*T*sizeof(float));
这样读取:
cudaMalloc((void**)&dev_test,B*T*sizeof(float));
此外,您致电
monte_carlo(dev_test,dev_v);
由于monte_carlo
是一个CUDA内核,你可能应该设置内核应该启动的块数和线程数:
monte_carlo<<<num_blocks, threads_per_block>>>(dev_test, dev_v);