我可以将表面对象绑定到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
答案 0 :(得分:3)
cudaResourceDesc :: resType必须是cudaResourceTypeArray,而cudaResourceDesc :: res :: array :: array必须设置为有效的CUDA数组句柄。
你不能用这个:
rd.resType = cudaResourceTypePitch2D;
您必须使用有效的cudaArray
类型。
您可以参考cuda samples(例如无边框纹理)以获取正确的曲面对象设置示例。