说我有一个内核
foo(int a, int b)
{
__shared__ int array[a];
}
似乎必须是一个常量值,我在int前添加了const。它没有用, 任何想法?
foo(const int a, const int b)
{
__shared__ int array[a];
}
答案 0 :(得分:5)
虽然由于C语言的限制你不能拥有动态大小的数组(如其他答案所述),你在CUDA中可以做的是这样的:
extern __shared__ float fshared[];
__global__ void testShmem( float * result, unsigned int shmemSize ) {
// use fshared - shmemSize tells you how many bytes
// Note that the following is not a sensible use of shared memory!
for( int i = 0; i < shmemSize/sizeof(float); ++i ) {
fshared[i] = 0;
}
}
让你告诉CUDA在内核调用期间你想要多少共享内存,如下所示:
testShmem<<<grid, block, 1024>>>( pdata, 1024 );
答案 1 :(得分:3)
我认为CUDA或OpenCL不允许您动态分配共享内存。请改用#define
宏。
如果您需要基于每个程序的动态大小的数组,您可以使用-D MYMACRO
(使用OpenCL,我不知道CUDA)提供它。见Bahbar的answer。
答案 2 :(得分:3)
在ISO C ++中,数组的大小需要是所谓的常量表达式。这比const限定变量更强。它基本上意味着编译时常量。因此,必须在编译时知道该值。
在ISO C90中也是如此。 C99添加了VLA,可变长度数组,允许在运行时确定大小。这些VLA的sizeof运算符成为运行时运算符。
我不熟悉CUDA或__shared__
语法。我不清楚为什么/如何使用术语内核。但我猜这些规则与w.r.t相似。常量表达式和数组。
答案 3 :(得分:1)
以下是使用C ++模板静态在CUDA中分配__shared__
数组n
数组的方法
template <int n>
kernel(...)
{
__shared__ int array[n];
}
const int n = 128;
kernel<n><<<grid_size,block_size>>>(...);
请注意,n
必须是编译时的已知常量才能生效。如果在编译时不知道n
,则必须使用Edric建议的方法。
答案 4 :(得分:-1)
我怀疑这是一个C语言问题。
如果是C ++,您只需使用std::vector
。
void foo( int a, int b )
{
std::vector<int> array( a );
// ...
}
如果真的是C ++,那么你可以安全使用的C ++功能可能取决于环境。目前尚不清楚“内核”是什么意思。