【问题标题】:Can one make unaligned loads and stores in CUDA?可以在 CUDA 中进行未对齐的加载和存储吗?
【发布时间】:2017-12-07 09:47:25
【问题描述】:

CUDA 是否支持未对齐的加载和存储?是否可以天真地从地址 addr 中读取大小为 k 字节的(单个)值,使得 addr % k != 0?

更具体地说,将访问诸如:

unsigned* p = (unsigned*) ((char *) my_aligned_ptr + 1); *p = 0xAABBCCDD;

unsigned* q = (unsigned*) ((char *) my_aligned_ptr + 11); unsigned x = *q;

有预期的效果吗?

【问题讨论】:

  • 您在现已删除的答案中链接的文档已经回答了这个问题。这是不可能的。如果您只是简单地尝试了您的代码,您会发现cuda-memcheck 报告了一个未对齐的错误。因此,无论您如何阅读或是否阅读文档,这都是它不起作用的更多证据。答案是不。指针的取消引用预计会发生在指针的自然对齐边界上,程序员有责任确保这种情况发生。我假设在你的第二个例子中你的意思是unsigned x = *q;
  • 如果有人需要解决这个限制,我给了一些example code in this answer 类似的问题。

标签: cuda nvidia gpgpu


【解决方案1】:

尽管 CUDA 编程指南的 Size and Alignment Requirement subsection 有点模棱两可,但答案是 不,不支持非对齐访问,句号。 代码将编译,但结果(可能)如下如果使用了一些附近的对齐地址。或者以其他方式未定义。

@tera 在this answer 中有解决方法。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2016-10-10
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2015-07-31
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多