内核函数参数为const

时间:2010-10-06 16:59:39

标签: c++ c cuda

说我有一个内核

foo(int a, int b)
{
    __shared__ int array[a];
}

似乎必须是一个常量值,我在int前添加了const。它没有用, 任何想法?

foo(const int a, const int b)
{
    __shared__ int array[a];
}

5 个答案:

答案 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 ++功能可能取决于环境。目前尚不清楚“内核”是什么意思。