如何交换两个固定大小的opencl-c阵列

时间:2014-07-20 09:32:30

标签: arrays opencl swap

我想以这种方式在opencl-c调用中交换两个数组:

uint tmp_a[L] = {...};
uint tmp_b[L] = {...};
swap(tmp_a, tmp_b); // (tmp_a, tmp_b) <- (tmp_b, tmp_a)

我想通过交换两个指针的基地址来做到这一点,但不幸的是

void swap(uint num_a[L], uint num_b[L]) {
    uint* tmp = num_a;
    num_a = num_b;
    num_b = tmp;
}

不起作用。

实际上我现在这样做:

for(int i = 0; i < L; ++i) {
        const uint tmp = num_a[i];
        num_a[i] = num_b[i];
        num_b[i] = tmp;
}

我想减少这种不必要的工作。

1 个答案:

答案 0 :(得分:2)

数组只是指向一块内存的指针。将数组传递给函数时(如在代码片段中),您将该指针的传递给函数。将参数传递给函数很像赋值操作。考虑这个简单的例子:

void foo(uint arg[L])
{
  arg = NULL;
}

uint bar[L] = {...};
foo(bar);

这基本上与:

相同
uint bar[L] = {...};
uint arg[L] = bar;
arg = NULL;

存储在bar中的指针不受foo函数内发生的赋值的影响。如果 希望修改bar函数中foo中存储的指针,我们应该传递bar地址

void foo(uint *arg[L])
{
  *arg = NULL;
}

uint bar[L] = {...};
foo(&bar);

相当于:

uint data[L] = {...};
uint *arg[L] = &bar;
*arg = NULL;

这一次,arg指向存储bar中包含的数据的内存,arg是指向数组值的指针。这意味着如果我们修改bar指向的内容,那么我们也会修改void swap(uint *num_a[L], uint *num_b[L]) { uint *tmp = *num_a; *num_a = *num_b; *num_b = tmp; } ... uint tmp_a[L] = {...}; uint tmp_b[L] = {...}; swap(&tmp_a, &tmp_b); // (tmp_a, tmp_b) <- (tmp_b, tmp_a)


将此应用于您的代码段如下所示:

{{1}}