CUDA内核中主机浮点常量的使用
我正在使用CUDA 5.0。我注意到编译器允许我在内核中使用主机声明的int常量。但是,它拒绝编译任何使用主机声明的float常量的内核。有人知道这种看似不一致的原因吗 例如,下面的代码运行正常,但如果内核中的最后一行没有注释,它将不会编译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
#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
,但是可以有外部链接,并且可以被设备识别。这是有道理的。谢谢你的解释!