ara*_*ste 4 math macos blas accelerate-framework
我刚刚开始使用vecLib框架来使程序在Mac OS X 10.7上进行密集的矩阵向量乘法.我做了一个这样简单的程序; 将矩阵a与向量x相乘,并将结果加到向量y上.
#include <vecLib/vectorOps.h>
#include <stdio.h>
float a[8][4] = // the matrix to be multiplied
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f},
};
float x[4] = {1.0f, 2.0f, 4.0f, 8.0f}; // the vector to be multiplied
float y[8] = {0.f, 0.f, 0.f, 0.f, // the result vector
0.f, 0.f, 0.f, 0.f};
int main() {
int i;
vSgemv('n', 8, 4, 1.0f, (const vFloat *)a, (const vFloat *)x, 1.0f, (vFloat *)y);
for (i = 0; i < 8; i++) {
printf("%.4f\n", y[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在控制台上编译并运行程序
gcc -framework vecLib -o test test.c && ./test
Run Code Online (Sandbox Code Playgroud)
但结果是这样的; 操作没有发生,结果向量仍然是空的.
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
Run Code Online (Sandbox Code Playgroud)
我是否缺少一些初始化来在vecLib框架中运行矩阵和向量函数?
Ste*_*non 10
首先,实际的bug非常简单,但你无法知道; 你正在传递'n'第一个参数,但实际上你需要传递'N'(尽管标题中写了什么).通过该修复,您的代码可以运行.
现在,那就是说,你做了一些更微妙的事情"错误"(ish).
首先,请不要使用vecLib.它被Accelerate.framework(10.4!)取代.vecLib.framework仅用于遗留支持.任何新的开发都应该与Accelerate相关联.
其次,请不要使用中定义的v*函数vectorOps.h.它们也已被替换,其中定义了行业标准的BLAS功能cblas.h.由于它们是标准的,因此有许多关于如何使用它们的公共文档,并且它们也得到了更快的实现的支持; vectorOps函数仅为传统支持维护.cblas.h还支持更多操作和数据类型.如果这还不够,如果您决定将代码移植到iOS,您会发现vectorOps函数根本不可用.使用这些cblas.h功能.
按照建议重写您的示例:
#include <Accelerate/Accelerate.h>
#include <stdio.h>
float a[8][4] = // the matrix to be multiplied
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 0.0f, 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, 0.0f},
{0.0f, 0.0f, 0.0f, 1.0f},
};
float x[4] = {1.0f, 2.0f, 4.0f, 8.0f}; // the vector to be multiplied
float y[8] = {0.f, 0.f, 0.f, 0.f, // the result vector
0.f, 0.f, 0.f, 0.f};
int main() {
int i;
cblas_sgemv(CblasRowMajor, CblasNoTrans, 8, 4, 1.0f, (float*)a, 4, x, 1, 1.0f, y, 1);
for (i = 0; i < 8; i++) {
printf("%.4f\n", y[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并运行它给出:
scanon$ gcc test.c -framework Accelerate -o test
scanon$ ./test
1.0000
2.0000
3.0000
12.0000
5.0000
5.0000
7.0000
8.0000
Run Code Online (Sandbox Code Playgroud)