2014-10-29 70 views
0

我可以将表面对象绑定到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

您的'独立示例'无法编译 – pQB 2014-10-29 11:51:34

+0

它需要您安装CUDA SDK。 – Jamboree 2014-10-29 13:37:55

+3

它还需要C++ 11功能支持(例如'auto'),这可能是pQB发表评论的原因。 – 2014-10-29 14:39:55

回答

3

参照the API documentation

cudaResourceDesc :: resType必须cudaResourceTypeArray和cudaResourceDesc :: RES ::阵列::阵列必须被设置为有效的CUDA数组句柄。

您不能使用此:

rd.resType = cudaResourceTypePitch2D; 

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

您可以参考cuda samples(例如无纹理纹理)作为适当表面对象设置的示例。

+0

谢谢,我不知何故从一些书中得到了一个印象,我可以将一个表面绑定到一个倾斜阵列。无论如何,'cudaCreateSurfaceObject'的API确实是错误的,如果它只能接受'cudaArray_t',它应该只需要'cudaArray_t'。 – Jamboree 2014-10-29 14:53:56

相关问题