如何将表面对象绑定到2D倾斜阵列?

时间:2014-10-29 08:17:25

标签: c++ cuda surface

我可以将表面对象绑定到CUDA数组,但无法将其绑定到2D节距数组。

以下是一个独立的示例:(请忽略其他资源管理问题)

#include "cuda_runtime.h"
#include <stdexcept>
#include <iostream>

void throw_on_error(cudaError_t ec)
{
    if (ec)
        throw std::runtime_error(cudaGetErrorString(ec));
}

int main()
{
    try
    {
        char* p;
        std::size_t stride;
        throw_on_error(cudaMallocPitch(&p, &stride, 8, 8));
        cudaSurfaceObject_t s;
        cudaResourceDesc rd = {};
        rd.resType = cudaResourceTypePitch2D;
        auto& data = rd.res.pitch2D;
        data.devPtr = p;
        data.pitchInBytes = stride;
        data.width = 8;
        data.height = 8;
        data.desc = cudaCreateChannelDesc<char>();
        throw_on_error(cudaCreateSurfaceObject(&s, &rd));
    }
    catch (std::exception& e)
    {
        std::cout << e.what();
    }

    return 0;
}

打印invalid argument,这里有什么问题?

计算能力:3.0

1 个答案:

答案 0 :(得分:3)

参考the API documentation

  

cudaResourceDesc :: resType必须是cudaResourceTypeArray,而cudaResourceDesc :: res :: array :: array必须设置为有效的CUDA数组句柄。

你不能用这个:

    rd.resType = cudaResourceTypePitch2D;

您必须使用有效的cudaArray类型。

您可以参考cuda samples(例如无边框纹理)以获取正确的曲面对象设置示例。