【发布时间】:2017-05-14 07:38:58
【问题描述】:
我正在为 1024 个矩阵运行适应度函数,每个矩阵都有自己的块并且大小相同。每个块都有n*n 线程(矩阵的维度)并且需要有n*n 共享内存,这样我就可以轻松地进行求和。但是,所有矩阵的维度n 在运行前是可变的(即可以手动更改,尽管始终是 2 的幂,所以求和很简单)。这里的问题是必须使用常量分配共享内存,但我还需要将值从主机传递给内核。我在哪里声明维度n,以便它对 CPU 可见(用于传递给内核)并且可用于声明共享内存的大小(在内核内)?
我的代码结构如下:
来自main.cu我调用内核:
const int num_states = 1024
const int dimension = 4
fitness <<< num_states, dimension * dimension >>> (device_array_of_states, dimension, num_states, device_fitness_return);
然后在kernel.cu 我有:
__global__ void fitness(
int *numbers,
int dimension,
int num_states,
int *fitness_return) {
__shared__ int fitness[16]; <<-- needs to be dimension * dimension
//code
}
numbers 是一个表示 1024 个矩阵的数组,dimension 是行列长度,num_states 是 1024,fitness_return 是一个长度为 1024 的数组,用于保存每个矩阵的适应度值。在内核中,共享内存是用dimension 的平方硬编码的(所以在这个例子中dimension 是4)。
我在哪里以及如何声明dimension,以便它可以用于分配共享内存以及调用内核,这样我只需在一个地方更新dimension?感谢您的帮助。
【问题讨论】:
-
编辑了我的答案。
-
在使用之前在全局范围内声明它。
-
模板参数在这种情况下是你的朋友
标签: cuda constants declaration gpu-shared-memory