加速:查找vDSP_maxviD的指针地址

时间:2018-04-03 13:04:46

标签: ios objective-c c accelerate-framework

我正在objective-c开展一个机器学习项目。哪个使用以下代码:

unsigned cStride = multiArray.strides[2].intValue;
unsigned hStride = multiArray.strides[3].intValue;
unsigned wStride = multiArray.strides[4].intValue;

for (unsigned h = 0; h < height; h++) {
    for (unsigned w = 0; w < width; w++) {
        unsigned highestClass = 0;
        double highest = -DBL_MAX;
        for (unsigned c = 0; c < channels; c++) {
            unsigned offset = c * cStride + h * hStride + w * wStride;
            double score = pointer[offset];
            if (score > highest) {
                highestClass = c;
                highest = score;
            }
        }
        // futher code
    }
}

到目前为止一切顺利,它运作良好。但是我遇到了Accelerate我要为这个类实现的,因为它可能比当前实现更快。

我决定实施vDSP_maxviDhttps://developer.apple.com/documentation/accelerate/1449682-vdsp_maxvid?language=objc

他们的实现如下:

  

__单精度实数输入向量。

     

__我迈向A

     

__ C输出标量

     

__ IC输出标量指数

     

__ N要处理的元素数量

他们的引擎盖Accelerate代码:

*C = -INFINITY;
for (n = 0; n < N; ++n)
{
    if (*C < A[n * I])
    {
        *C = A[n * I];
        *IC = n * I;
    }
}

现在我开始考虑这种情况下的参数需要变成什么:

__A将成为pointer

__C将成为highest

__IC将成为highestClass

__N将成为channels

但是,我将__I留空了。这是因为我不知道如何找到合适的pointer地址。我之前使用的代码:

unsigned offset = c * cStride + h * hStride + w * wStride;

但是,我们现在错过c,并在n框架内被Accelerate取代。

我的pointer索引的正确计算是什么?

3 个答案:

答案 0 :(得分:2)

使用pointer作为vDSP_maxviD忽略hw依赖偏移量的第一个参数导致

问题。

尝试:

double *channels_pointer = &pointer[h * hStride + w * wStride];

vDSP_maxviD(channels_pointer, cStride, &highest, &highestClass, channels);

答案 1 :(得分:0)

编辑:删除不必要的循环

我会尝试这样的事情(未经测试):

import { RequestHandler, ErrorRequestHandler } from 'express';
import * as Joi from 'joi';

interface IValidator {
  validator: (data: string) => Joi.AnySchema
}

const thing: IValidator = {
  validator: data => {
    return Joi.string()
  }
}

// this works
console.log(
  thing.validator("javascript")
);

interface IMiddleware {
  middleware: (RequestHandler|ErrorRequestHandler)[]
}

const thing2: IMiddleware = {
  middleware: [
    (res, req, next) => {
      return next()
    },
    "foo" // this causes an error
  ]
}

答案 2 :(得分:0)

感谢 Grzegorz Owsiany ,最终的解决方案是:

double *channels_pointer = &pointer[h * hStride + w * wStride];
vDSP_maxviD(channels_pointer, cStride, &highest, &highestClass, channels);

但是,我还需要这样做:

highestClass /= cStride;