使用cos时,Cuda从_设备_函数返回错误值
我试图在nvidia GPU上运行此代码,它返回奇怪的值。它由两个模块组成,使用cos时,Cuda从_设备_函数返回错误值,c,memory-management,cuda,nvidia,trigonometry,C,Memory Management,Cuda,Nvidia,Trigonometry,我试图在nvidia GPU上运行此代码,它返回奇怪的值。它由两个模块组成,main.cu和exmodul.cu(下面列出了这些模块)。对于我正在使用的建筑: nvcc -dc -arch sm_35 main.cu nvcc -dc -arch sm_35 exmodul.cu nvcc -arch sm_35 -lcudart -o main main.o exmodul.o 如果我跑那我就得到了奇怪的最后一行gd必须为1 result=0 result=0 result=0 re
main.cu
和exmodul.cu
(下面列出了这些模块)。对于我正在使用的建筑:
nvcc -dc -arch sm_35 main.cu
nvcc -dc -arch sm_35 exmodul.cu
nvcc -arch sm_35 -lcudart -o main main.o exmodul.o
如果我跑那我就得到了奇怪的最后一行gd必须为1
result=0
result=0
result=0
result=0
gd=-0.5
- 当我将
中的exmodul.cu
更改为大于1.0
或以下1.000000953
,则返回正确值 结果0.9999999999999945
- 当我在
中更改exmodule.cu
时,除了值1.1
之外,它也会失败1.0
- 行为不依赖于同一模块中的常量
2.0
- 当我使用另一个函数而不是像
或sin
那样的exp
时,它工作正常cos
- 使用
double q=cos(1.1)代码>无效
- 当我将函数
复制到模块extFunc()
时,它工作正常main.cu
- 如果我取消注释
在*gd=1.0
中,它返回正确的main.cu
1.0
gd=6.1232329394368592e-17,但仍然错误)。OS:Debian Jessie
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Thu_Mar_13_11:58:58_PDT_2014
Cuda compilation tools, release 6.0, V6.0.1
你知道怎么了吗
谢谢,卢卡斯
main.cu
#include <stdio.h> // printf
#include "exmodul.h" // extFunc
__global__ void mykernel(double*gd);
void deviceCheck();
int main(int argc, char *argv[])
{
double gd, *d_gd;
cudaMalloc(&d_gd, sizeof(double)); deviceCheck();
mykernel<<<1,1>>>(d_gd); deviceCheck();
cudaMemcpy(&gd, d_gd, sizeof(double), cudaMemcpyDeviceToHost);
deviceCheck();
cudaFree(d_gd); deviceCheck();
fprintf(stderr,"gd=%.17g\n",gd);
return 0;
}
void deviceCheck()
{
cudaError_t result = cudaSuccess;
cudaDeviceSynchronize();
result = cudaGetLastError();
fprintf(stderr,"result=%d\n",result); fflush(stderr);
}
__global__ void mykernel(double *gd)
{
*gd = extFunc();
//*gd=1.0;
__syncthreads();
return;
}
我能够在支持的配置(CUDA 6.5、CentOS 6.2、K40)上重现有问题的行为
当我从CUDA 6.5切换到CUDA 7 RC时,问题就消失了
在旧配置(CUDA 5.5、CentOS 6.2、M2070)上,该问题似乎也无法重现
我建议切换到CUDA 7 RC来解决这个问题。我怀疑编译过程中存在已修复的潜在错误。cos()返回值的范围是-1+1.所以这一行:'if(这一行:'printf(stderr,“gd=%.17g\n”,gd);'不正确,它应该是:'fprintf(stderr,“gd=%.17g\n”,gd);“//注意不同的函数调用,'gd'中的值始终为1.0,格式转换在小数点后没有字符可以打印1。这就是为什么所有打印值都是0user3629249:谢谢。不需要包含math.h
,请参见[1]。我希望它必须返回q==1,因为-1<,因为我无法重现该问题,但我在Windows上使用CUDA 6.5。不同GPU上返回的不同值表明CUDA API调用失败。您的错误检查似乎没有尽可能严格,您可能希望尝试直接检查API的返回状态函数,一个启动前加上启动后的内核错误,如图所示,例如,@luuucky是Debian a支持CUDA 6.0的操作系统吗?根据NVIDIA的说法,如果不是,你就靠自己了,因为NVIDIA还没有验证正确的CUDA操作系统。你可能想查询Debian特定的论坛或邮件列表。我怀疑这个问题是本地的您的系统(错误安装等)。谢谢。我提交了一个错误没有nvidia。
#include "exmodul.h"
__device__ double extFunc()
{
double q = 1.1;
q = cos(q);
if(q<2.0) { q = 1.0; }
return q;
}
__device__ double extFunc();