使用cos时,Cuda从_设备_函数返回错误值

使用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

我试图在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
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
在Nvidia GT750M和GeForce GTX TITAN Black上测试。(在GT750M上,返回不同的值
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();