CUDA:如何在数组指针数组上应用__restrict__?

时间:2011-12-07 07:35:06

标签: cuda restrict-qualifier

这个使用两个__restrict__ int数组的内核编译得很好:

__global__ void kerFoo( int* __restrict__ arr0, int* __restrict__ arr1, int num )
{
    for ( /* Iterate over array */ )
        arr1[i] = arr0[i];  // Copy one to other
}

但是,组成指针数组的两个int数组相同,编译失败:

__global__ void kerFoo( int* __restrict__ arr[2], int num )
{
    for ( /* Iterate over array */ )
        arr[1][i] = arr[0][i];  // Copy one to other
}

编译器给出的错误是:

error: invalid use of `restrict'

我有一些结构作为指向数组的指针数组。 (例如,传递给具有int* arr[16]的内核的结构。)如何将它们传递给内核并能够对它们应用__restrict__

2 个答案:

答案 0 :(得分:2)

CUDA C手册仅涉及__restrict__的C99定义,没有特殊的CUDA特定情况。

由于指示的参数是一个包含两个指针的数组,因此__restrict__的使用看起来对我来说完全有效,没有理由让编译器抱怨恕我直言。我会请编译器作者验证并可能/可能正确解决该问题。不过,我对不同的意见感兴趣。

@talonmies的一句话:

  

restrict 的重点是告诉编译器两个或多个指针参数永远不会在内存中重叠。

这并非严格属实。 restrict告诉编译器,在其生命周期内,有问题的指针是唯一可以通过其访问指向对象的指针。请注意,指向的对象只是假设int的数组。 (实际上在这种情况下它只有一个int。)由于编译器无法知道数组的大小,因此程序员需要保护数组的边界。

答案 1 :(得分:0)

通过一些任意迭代填充代码中的注释,我们得到以下程序:

__global__ void kerFoo( int* __restrict__ arr[2], int num )
{
    for ( int i = 0; i < 1024; i ++)
        arr[1][i] = arr[0][i];  // Copy one to other
}

以及compiles fine和CUDA 10.1(Godbolt.org)。