CUDA内核中主机浮点常量的使用

CUDA内核中主机浮点常量的使用,cuda,constants,host,Cuda,Constants,Host,我正在使用CUDA 5.0。我注意到编译器允许我在内核中使用主机声明的int常量。但是,它拒绝编译任何使用主机声明的float常量的内核。有人知道这种看似不一致的原因吗 例如,下面的代码运行正常,但如果内核中的最后一行没有注释,它将不会编译 #include <cstdio> #include <cuda_runtime.h> static int __constant__ DEV_INT_CONSTANT = 1; static float __constan

我正在使用CUDA 5.0。我注意到编译器允许我在内核中使用主机声明的int常量。但是,它拒绝编译任何使用主机声明的float常量的内核。有人知道这种看似不一致的原因吗

例如,下面的代码运行正常,但如果内核中的最后一行没有注释,它将不会编译

#include <cstdio>
#include <cuda_runtime.h>

static int   __constant__ DEV_INT_CONSTANT   = 1;
static float __constant__ DEV_FLOAT_CONSTANT = 2.0f;

static int   const        HST_INT_CONSTANT   = 3;
static float const        HST_FLOAT_CONSTANT = 4.0f;

__global__ void uselessKernel(float * val)
{
    *val = 0.0f;

    // Use device int and float constants
    *val += DEV_INT_CONSTANT;
    *val += DEV_FLOAT_CONSTANT;

    // Use host int and float constants
    *val += HST_INT_CONSTANT;
    //*val += HST_FLOAT_CONSTANT; // won't compile if uncommented
}

int main(void)
{
    float * d_val;
    cudaMalloc((void **)&d_val, sizeof(float));

    uselessKernel<<<1, 1>>>(d_val);

    cudaFree(d_val);
}
#包括
#包括
静态int uu常数u u u DEV u int u常数=1;
静态浮点数uuu常数uuu偏差u浮点数u常数=2.0f;
静态整数常数HST_整数常数=3;
静态浮点数常数HST\U浮点数常数=4.0f;
__全局\uuuuu无效uselessKernel(浮点*val)
{
*val=0.0f;
//使用设备int和float常量
*val+=偏差积分常数;
*val+=偏差浮点数常数;
//使用主机int和float常量
*val+=HST_INT_常数;
//*val+=HST_FLOAT_常量;//如果未注释,则不会编译
}
内部主(空)
{
浮动*d_val;
cudaMalloc((void**)和d_val,sizeof(float));
uselessKernel(d_val);
库达弗里(杜瓦尔);
}

在设备代码中添加常量编号可以,但在设备代码中添加存储在主机内存中的编号则不行

当从未引用该变量的addr时,编译器/优化器可以用值
3
替换代码中对
static const int
的每个引用。在这种情况下,它类似于
#define HST_INT_CONSTANT 3
,并且没有为该变量分配主机内存

但是对于
float
var,即使主机内存是
static const float
,主机内存也总是被分配的。由于内核无法直接访问主机内存,因此不会编译带有
static const float
的代码

对于C/C++,
int
可以比
float
更积极地进行优化


你的代码运行时的评论可以被看作是一个错误的CUDAC我想。
static const int
是主机端的东西,设备不应该直接访问它。

我不确定这一点,但它与全局变量的链接有关。当我运行代码时,无论我指定什么存储类,浮点全局变量都具有
静态
链接。因此,设备无法识别它们
int
,但是可以有外部链接,并且可以被设备识别。这是有道理的。谢谢你的解释!