正确的是将数组从Metal Kernel函数传递给本地函数

时间:2018-05-05 23:51:00

标签: metal

我正致力于将计算模型从Cuda转换为Metal。

我有一些全局结构数组,我试图从内核函数传递给函数。

我收到以下错误:

  
      
  1. 候选函数不可行:没有已知的'float3 device [32]'转换为'float3 *'(又名'vector_float3 *')第二个参数
  2.   

对于testFunction。

以下是示例代码:

#include <metal_stdlib>
using namespace metal;

struct DOBJ
{
    int      num_vertex;        /* Number of vertcies */
    float3   vert       [32];  /* Rotated on CPU */    
};

bool testFunction(
                          uint num_vertex_B,
                          float3 Vertex_B[32])
{
}

kernel void TestKernel( device DOBJ *VolumeObject )
{

    int d_index = 5;

    bool SP_Check = testFunction(
                                    VolumeObject[d_index].num_vertex,
                                    VolumeObject[d_index].vert );
}

CUDA testFunction的原始形式具有以下格式:

__device__ bool testFunction(
                          uint num_vertex_B,
                          float3 *Vertex_B)
{
}

我有很多代码遵循程序中的这种结构。如何正确格式化testFunction以接受Vertex_B?

来自warrenm的评论之后的更多测试代码

  1. 这个编译但我还没有尝试过任何运行测试。
  2. 你可以有两个“testFunction”只是因为向量的内存位置不同而是完全相同的代码。
  3. float3 Vertex_B [5]编译线程内存但不编译设备内存。

    #include <metal_stdlib>
    using namespace metal;
    
    struct DOBJ
    {
        int      num_vertex;        /* Number of vertcies */
        float3   vert       [32];  /* Rotated on CPU */ 
    };
    
    bool testFunction(uint num_vertex_B, device float3 *Vertex_B) { return false; }
    
    bool testFunction(uint num_vertex_B, thread float3 *Vertex_B) { return false; }
    
    bool testFunction2( uint num_vertex_B, float3 Vertex_B[5]) { return false; }
    
    kernel void VolumeObject_InteractionPolyhedra( device DOBJ *VolumeObject )
    {
    
        int d_index = 5;
    
        bool SP_Check = testFunction( VolumeObject[d_index].num_vertex, VolumeObject[d_index].vert);
    
        // Compiler error: 1. Candidate function not viable: no known conversion from 'float3 device[32]' to 'float3 *' (aka 'vector_float3 *') for 2nd argument
        // bool SP_Check2 = testFunction2( VolumeObject[d_index].num_vertex, VolumeObject[d_index].vert);
    
        thread float3 *vertList;
        bool SP_Check3 = testFunction( 5, vertList);
    
        bool SP_Check4 = testFunction2( 5, vertList);
    }
    

1 个答案:

答案 0 :(得分:4)

无法通过C或C ++中的值传递数组(其中Metal Shading Language是一种方言)。但是,只要指针与原始缓冲区位于同一地址空间,您的函数就可以获取引用该数组的指针参数:

bool testFunction(uint num_vertex_B, device float3 *Vertex_B)
{
}