使用CUDA内核的数组操作

使用CUDA内核的数组操作,c,cuda,nvidia,C,Cuda,Nvidia,我正在编写CUDA内核,线程正在执行以下任务: for example i have array of [1, 2, 3, 4] then I want answer [12, 13, 14, 23, 24, 34] 假设我有一个包含n个整数的数组,我有两个索引I和j C语言中的简单解决方案是: k=0; for (i = 0; i < n - 1; i++) for(j = i+1; j < n-1 ; j++) { new_array[k] = array

我正在编写CUDA内核,线程正在执行以下任务:

for example i have array of [1, 2, 3, 4] then I want answer [12, 13, 14, 23, 24, 34]
假设我有一个包含n个整数的数组,我有两个索引I和j

C语言中的简单解决方案是:

k=0;
for (i = 0; i < n - 1; i++)
    for(j = i+1; j < n-1 ; j++)
       { new_array[k] = array[i]*10 + array[j];
          k++;
        }
在CUDA,我尝试了我的运气:

for(i = threadIdx.x + 1; i < n-1; i++ )
    new_array[i] = array[threadIdx.x] * 10 + array[i];

但我认为这不是完全正确或最佳的方法。有谁能提出更好的建议吗?

我假设您要移植到CUDA的代码如下:

#include <stdio.h>
#define N 7

int main(){

    int array[N] = { 1, 2, 3, 4, 5, 6, 7};
    int new_array[(N-1)*N/2] = { 0 };

    int k=0;
    for (int i = 0; i < N; i++)
        for(int j = i+1; j < N; j++)
        { 
            new_array[k] = array[i]*10 + array[j];
            k++;
        }

    for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);

return 0;

请添加您自己的CUDA错误检查。此外,您可能希望将上述CUDA代码扩展到非幺正大小的块网格。

您描述的上述字符成对串联的问题似乎与for循环所示的问题完全不同。在后一种情况下,您似乎面临一个内部循环的问题。thnanku@jackolanten。我会查出来的。这是你之前发布的问题的重复,现在被删除了。您发布的纯C代码@JackOLantern你能把你的回复作为一个答案吗,我会投赞成票。对上面的代码感到非常抱歉。我改变了一点@RobertCrovella你能再试一次吗。请…为什么不像我一样提供一个完整的代码,包括编译和运行程序所需的所有include文件和一切,并像我一样显示运行程序时的实际结果。同样地,您应该为发布的CUDA代码执行此操作。这表明你在某种程度上理解了你所问的问题,并且具备了所需的一些基本知识。事实上,所以:3.询问代码的问题必须证明对问题的理解是最低限度的。。。
for (int i = 0; i < N; i++)
    for(int j = i+1; j < N; j++)
        new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j];
#include <stdio.h>
#define N 7

__global__ void kernel(int* new_array_d, int* array_d) {

    int i = threadIdx.x;
    int j = threadIdx.y;

    if (j > i) new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + array_d[j];
}

int main(){

    int array[N] = { 1, 2, 3, 4, 5, 6, 7};
    int new_array[(N-1)*N/2] = { 0 };

    int* array_d;       cudaMalloc((void**)&array_d,N*sizeof(int));
    int* new_array_d;   cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int));

    cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice);

    dim3 grid(1,1);
    dim3 block(N,N);
    kernel<<<grid,block>>>(new_array_d,array_d);

    cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost);

    for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);

    return 0;
}