c++ - CUDA 减少查找最大值
问题描述
我正在尝试编写自己的最大数量减少搜索的实现。这是我的第一个 CUDA C 程序,我遇到了一些我还无法理解的错误。
我的代码:
__global__
void reduce (box * d_in_data, int insize, box * d_out_data)
{
/*
for example:
array size = 25200 (size variable, keep in d_in_data)
gridDim = 252
blockDim = 10
*/
uint32_t tid = threadIdx.x;
//__shared__ box sdata[insize / gridDim.x]; // 25200 / 252 = 100
extern __shared__ box sdata[]; // 25200 / 252 = 100
/*spt its 'size per thread' for filling sdata*/
/* (25200 / 252) / 10 */ /* each thread should be copy 10 elements from d_in_data to sdata */
uint32_t spt = (insize / gridDim.x) / blockDim.x;
box (* sh_ptr)[blockDim.x][spt] = (box (*) [blockDim.x][spt]) &sdata;
for (int i = 0;i < spt;i++){
(*sh_ptr)[tid][i] = d_in_data[blockIdx.x * (insize / gridDim.x) + (tid * blockDim.x + i)];
}
__syncthreads();
box temp = (*sh_ptr)[tid][0];
for (int i = 0;i < spt;i++){
box i_box = (*sh_ptr)[tid][i];
temp = temp.s < i_box.s ? i_box : temp;
}
(*sh_ptr)[tid][0] = temp;
__syncthreads();
box (* d_out_ptr)[gridDim.x][blockDim.x] = (box (*)[gridDim.x][blockDim.x]) d_out_data;
(*d_out_ptr)[blockIdx.x][tid] = (*sh_ptr)[tid][0];
}
__shared__ box sdata[insize / gridDim.x];
- 为什么“这里不能用作常数”?如何明确设置大小?box (* sh_ptr)[blockDim.x][spt] = (box (*) [blockDim.x][spt]) &sdata;
- “错误:表达式必须有一个常量值”、“注意:尝试访问运行时存储”、“注意:变量“spt”的值”。在我的情况下如何正确书写?uint32_t spt = (insize / gridDim.x) / blockDim.x;
- “这里不能用作常数”box (* d_out_ptr)[gridDim.x][blockDim.x] = (box (*)[gridDim.x][blockDim.x]) d_out_data;
- "error: expression must have a constant value" , "note: attempt to access run-time storage" , 这里也一样。
请告诉我我在每个段落中哪里出错了。
解决方案
您的错误与 CUDA 无关。
__shared__ box sdata[insize / gridDim.x];
- 为什么“这里不能用作常数”?如何明确设置大小?
在 C/C++ 中,数组大小必须在编译时知道。在这里,insize / gridDim.x
必须在编译时知道,但insize
肯定不是。extern __shared__ box sdata[];
在我看来完全没问题。如果你需要这个数组的大小(你当然需要),你可以在运行时以函数参数等形式计算它。
box (* sh_ptr)[blockDim.x][spt] = (box (*) [blockDim.x][spt]) &sdata;
- “错误:表达式必须有一个常量值”、“注意:尝试访问运行时存储”、“注意:变量“spt”的值”。在我的情况下如何正确书写?
在这里,您尝试定义一个指向 2D 数组的指针。只有当数组的最后一个维度在编译时已知但spt
不知道时,这才有可能。为了规避它,您需要自己计算进入共享内存 (sdata
) 的地址。这是一个一维数组并以这种方式对待它。错误号 3 似乎是一条诊断消息,而不是错误。
错误编号 4 与错误编号 2 的类型相同。
如需进一步阅读,请参阅C 中指向多维数组的指针?
推荐阅读
- windows - 如何让多个 Windows 用户(非管理员)修改并保存相同的设置?
- javascript - 带有路径列表的 PHP 面包屑
- visual-studio-cordova - 科尔多瓦的自签名证书有什么办法吗?
- reactjs - Enzyme/Jest Context API 注入(React)不起作用
- java - 在 Spring Boot 和谷歌云中返回 arraylist
- reactjs - 将转译的“jsx”代码缩小为浏览器可读格式的问题
- c# - 按两个不同的列表排序列表
- javascript - Ajax 不断重定向到 php 页面
- ios - Swift 4 和 Xcode 10。在应用启动时播放视频,完成后显示视图控制器
- node.js - 需要解析SQS消息