【问题标题】:cuda 2D layered tex size: too large?cuda 2D 分层 tex 大小:太大?
【发布时间】:2017-04-20 16:32:58
【问题描述】:

如果代码在 cuda 中启动 3D 数组,其大小为 width = 809;高度 = 127;层数=2160;

cudaArray *sinor;
    cudaExtent volumeSize = make_cudaExtent(809, 127, 2160);
const cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();
gpuErrchk(cudaMalloc3DArray(&sinor, &channelDesc, volumeSize, cudaArrayLayered));

最后一行返回错误“无效参数”错误。是不是因为我的层数太大了?我试过1940,还好。如果我不能做这么多的层,这里有什么工作?非常感谢。

【问题讨论】:

  • 层数限制为 2048 - 检查deviceQuery
  • @RobertCrovella:有解决办法吗?
  • 您可以有two texture objects/references,并根据图层索引在两者之间进行选择。
  • @RobertCrovella 让我试一试。 tex的指针,还是tex的向量?这适用于 CUDA?
  • 您不需要任何东西的指针或向量。你知道如何创建纹理对象吗?伟大的。创建其中 2 个。让我们称一个 texA 和另一个 texB。当需要进行纹理提取时,如果您的首选图层索引小于 2048,则纹理来自 texA.如果您的首选图层索引大于 2048,则纹理来自 texB,但从您的首选图层索引中减去 2048。这是一个带有 2 个纹理的简单 if-then-else 语句。没有任何指针或向量。

标签: memory cuda texture2d


【解决方案1】:

您可以在文档here 中找到纹理层深度限制。正如您所推断的,分层纹理和表面的深度限制为 2048。

正如 cmets 中所建议的,您唯一真正的解决方法是将数据拆分到多个纹理对象上,并根据虚拟组合纹理中的索引在对象之间进行选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2021-08-13
    • 2015-12-06
    • 2017-10-16
    • 2019-08-08
    相关资源
    最近更新 更多