c - 指向指针别名的指针和 restrict 关键字

标签 c pointers caching cuda restrict-qualifier

在这种情况下,我熟悉 __restrict 关键字在 C 中用于性能优化的用法,特别是 CUDA。

void Foo(const float* __restrict X, const float* __restrict Y);

我知道这个 Foo 函数有 __restrict 关键字,它向编译器表明 X 和 Y 保证指向不同的内存块。

当我们有一个指向别名限制的指针时会发生什么?

void Bar1(const float* const * __restrict X, const float* const * __restrict Y);
void Bar2(const float* const __restrict * __restrict X, const float* const __restrict * __restrict Y);

Bar1 是完全受限还是每个间接级别都需要受限,如 Bar2 所示?

哪个语法正确表明所有指针都可以利用或只读缓存?我是否需要“限制”两个指针或仅“限制”顶级变量名称?

最佳答案

Do I need to "restrict" both pointers or only the top level variable name?

限制指针的两个“级别”。

即使这对于启用非一致/只读缓存的使用不是必需的 - 这仍然是正确的选择,因为您在输入参数的描述中更加明确。您让使用您的函数的人更清楚,他们不应将内部指针指向重叠位置。

关于c - 指向指针别名的指针和 restrict 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66646856/

相关文章:

javascript - 如果我没有先显式缓存它们,我的 JS 代码如何访问 DOM 元素?

C——指针三维数组

c++ - 为什么在重定向 stdout 和 stdin 时 Python 的行为不符合预期?

c# - 使用 CLI 将 C# double 组传递给 C++ 函数

c - 指针表达式 "based on"何时是另一个指针?

android - picasso 第一次加载不缓存,但第二次就可以了

c# - 如何缓存具有多个属性的对象

c - 以下代码的输出是什么以及如何输出?

c - 为什么这个 long double 不能使用 printf 正确打印出来?

C : freeing a reallocated pointer