Parallel processing 使用依赖项并行化代码

Parallel processing 使用依赖项并行化代码,parallel-processing,cuda,openmp,hpc,Parallel Processing,Cuda,Openmp,Hpc,我有一个如下代码: 数组a包含有关其元素所属组的信息。i、 e.元素i属于a[i]组。每个组可以包含两个元素。我想将此信息存储在长度为2*组数的b中。因此,b[j]和b[j+1]处的值将给出属于组j/2(整数除法)和j的元素是偶数 void assign(int *a, int *b){ for(int i = 0; i<N; i++){ int group = a[i]; int posit=2*group; if(b[2*i]!=

我有一个如下代码:

数组
a
包含有关其元素所属组的信息。i、 e.元素
i
属于
a[i]
组。每个组可以包含两个元素。我想将此信息存储在长度为
2*组数的b中。因此,
b[j]
b[j+1]
处的值将给出属于组
j/2(整数除法)和
j
的元素是偶数

void assign(int *a, int *b){
    for(int i = 0; i<N; i++){
        int group = a[i];
        int posit=2*group;
        if(b[2*i]!=0){
            posit++;
        }
        b[posit] = i;
    }
}

N as is clear length of a.
void赋值(int*a,int*b){

对于(inti=0;i一般来说,您可以尝试在包含pairs
{i,a[i]}
的数组上简单地使用并行排序算法。也许有一种更快的通用方法,我目前没有看到

但是,特别是在CUDA中,您可以利用这样一个事实:当您有两个冲突的线程将一个32位字写入同一个内存位置时,一个线程肯定会成功(但您不知道是哪个线程)。从形式上讲,它充当一台机器

因此,您可以通过两个内核调用来解决问题:

__global__ void assign1(int* a, int* b, int elementCount) {
    int idx = threadIdx.x + blockIdx.x*blockDim.x;
    if (idx<elementCount) {
        int group = a[idx];
        b[2*group] = idx;
    }
}

__global__ void assign2(int* a, int* b, int elementCount) {
    int idx = threadIdx.x + blockIdx.x*blockDim.x;
    if (idx<elementCount) {
        int group = a[idx];
        if (b[2*group] != idx)
            b[2*group+1] = idx;
    }
}

__host__ void assign(int* dev_a, int* dev_b, int elementCount) {
    int gridSize = elementCount/512+1;
    int blockSize = 512;
    assign1<<<gridSize,blockSize>>>(dev_a, dev_b, elementCount);
    assign2<<<gridSize,blockSize>>>(dev_a, dev_b, elementCount);
}
\uuuu全局\uuuuu无效分配1(int*a,int*b,int elementCount){
int idx=threadIdx.x+blockIdx.x*blockDim.x;
如果(idx