我目前正在用C进行矩阵转置。在我的算法中有很多交换操作。我需要交换两个(双*)点指向的双精度数。
void transposenRightHalf(double *m, int size){
double temp;
for (int i = 0; i < size-1; i++) {
for (int j = i+1; j < size; j++) {
temp = *(m+i*size+j);
*(m+i*size+j) = *(m+j*size+i);
*(m+j*size+i) = temp;
}
}
}
由于我在使用x86架构的cray机器上执行此操作,因此我尝试使用内联汇编来执行交换操作。我做了一些搜索,但找不到一个。我真的需要一些帮助。
答案 0 :(得分:0)
AVX2收集指令可能会为并行化提供一些机会。
操作受到内存带宽的限制,因此您需要考虑如何安排内存访问以充分利用缓存。以块为单位而不是一次进行一次转置会大大增加内存访问的局部性。注意缓存关联性限制,如果访问的步幅错误,可能会使缓存行为意外地变小(尽管最糟糕的情况是,这会降低到当前性能)。