这个使用两个__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__
?
答案 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)。