我正致力于将计算模型从Cuda转换为Metal。
我有一些全局结构数组,我试图从内核函数传递给函数。
我收到以下错误:
- 候选函数不可行:没有已知的'float3 device [32]'转换为'float3 *'(又名'vector_float3 *')第二个参数
醇>
对于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的评论之后的更多测试代码
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);
}
答案 0 :(得分:4)
无法通过C或C ++中的值传递数组(其中Metal Shading Language是一种方言)。但是,只要指针与原始缓冲区位于同一地址空间,您的函数就可以获取引用该数组的指针参数:
bool testFunction(uint num_vertex_B, device float3 *Vertex_B)
{
}