我知道我可以使用以下代码修改select元素:
int* idx = ...
float* x = ...
float* a = ...
for (int i=0; i<N; i++){
x[idx[i]] = a[i];
}
一个更清晰的例子是使用等效的Python语法:
x = zeros(8)
idx = array([1, 4, 5, 7, 2])
x[idx] = arange(5)*20
// x = [0, 20, 20, 0, 20, 20, 0, 20]
但我知道人们花了很多时间来优化像这样的简单for循环。我已经尝试查看LAPACK,BLAS和vDSP的文档,但没有找到修改select元素的函数。
我找到了x[i] = a[idx[i]]
的函数,基本上与我想要的函数相反。什么函数根据另一个数组修改数组中的select元素?
答案 0 :(得分:0)
请记住,在优化和不优化之间不是那么黑白;最糟糕的情况是,您可以随时自我渲染。你要使用Grand Central Dispatch;其他图书馆包括OpenMP。
查看Wikipedia example并运行以下代码,使用两个单独的版本并取消注释相应的部分,
NSLog(@"Start");
//dispatch_async(dispatch_get_main_queue(), ^{
for (int i=0; i<N; i++){
x[j[i]] = b[i];
}
//});
NSLog(@"End");
我们得到以下结果:
dispatch_async:
2014-07-25 21:12:23.509 swix[15390:303] Start
2014-07-25 21:12:26.649 swix[15390:303] End
Serial:
2014-07-25 21:12:55.719 swix[15428:303] Start
2014-07-25 21:12:58.860 swix[15428:303] End
我们双向获得3.1秒。假设我提到的维基百科示例没有任何简单的拼写错误,我猜想编译器会将这个简单的循环优化到极致(特别是考虑到我的优化标志-Ofastest
。