修改数组的选择元素

时间:2014-07-13 22:59:49

标签: c indexing blas

我知道我可以使用以下代码修改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循环。我已经尝试查看LAPACKBLASvDSP的文档,但没有找到修改select元素的函数。

我找到了x[i] = a[idx[i]]的函数,基本上与我想要的函数相反。什么函数根据另一个数组修改数组中的select元素?

1 个答案:

答案 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