在CUDA内核中执行后选择所选元素

在CUDA内核中执行后选择所选元素,c,cuda,C,Cuda,我正在尝试在CUDA中转换以下c代码。。。。 在下面的代码中,我得到了元素数组[12,13,23,24,25]。。。 我希望输出像[1232342345]。。 您将通过查看代码获得逻辑 #include <stdio.h> #define N 5 int main(){ int i,j; int array[N] = { 12, 13, 23, 24, 25}; int new_array[(N-1)*N/2] = { 0 }; int k=0; for ( i = 0; i

我正在尝试在CUDA中转换以下c代码。。。。 在下面的代码中,我得到了元素数组[12,13,23,24,25]。。。 我希望输出像[1232342345]。。 您将通过查看代码获得逻辑

#include <stdio.h>
#define N 5

int main(){

int i,j;
int array[N] = { 12, 13, 23, 24, 25};
int new_array[(N-1)*N/2] = { 0 };

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

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

return 0;
}
#包括
#定义n5
int main(){
int i,j;
int数组[N]={12,13,23,24,25};
int新_数组[(N-1)*N/2]={0};
int k=0;
对于(i=0;i
现在问题来了,当我尝试转换成CUDA内核。。。 我在输出中得到了一些东西,但我不知道如何选择选择性元素并将其存储在数组中

#include <stdio.h>
#define N 5   
__global__ void kernel(int* new_array_d, int* array_d) {

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

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

int main(){

int array[N] = { 12, 13, 23, 24, 25};
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;
}
#包括
#定义n5
__全局无效内核(int*新数组,int*数组){
int i=threadIdx.x;
int j=螺纹内径x.y;
如果(j>i&(array_d[i]-(array_d[i]%10))==(array_d[j]-(array_d[j]%10)))
新的数组d[i*N+(j-(i+1))-(i)*(i+1)/2]=数组d[i]*10+(数组d[j]%10);
}
int main(){
int数组[N]={12,13,23,24,25};
int新_数组[N-1)*N/2]={0};
int*array_d;cudamaloc((void**)和array_d,N*sizeof(int));
int*新数组;cudamaloc((void**)和新数组(N-1)*N/2*大小(int));
cudaMemcpy(数组,数组,N*sizeof(int),cudaMemcpyHostToDevice);
dim3网格(1,1);
dim3块(N,N);
内核(新的数组d,数组d);
cudaMemcpy(新数组,新数组,N-1)*N/2*sizeof(int),cudamemcpydevicetoost);
对于(int i=0;i<(N-1)*N/2;i++)printf(“新_数组[%d]=%d\N”,i,新_数组[i]);
返回0;
}
我应该尝试不同的索引还是只在CPU上进行。。。?? 请帮帮我。。。 提前通知

请注意: 我试着把元素12和13组合起来,只有当除了单位位置之外的数字是相同的。。。 12和13…(共有1个)…做12*10+(13%10)=123


23和25…(共有2个)…do 23*10+(25%10)=235…

除了上面评论中报告的编译问题外,您的代码似乎没有显示任何逻辑问题。您正在观察未设置数组值的不同结果,因为最终数组
new\u array
new\u array\u d
尚未初始化

您可以通过向代码中添加以下行来解决此问题:

memset(new_array,0,(N-1)*N/2*sizeof(int));
cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int));
#include <stdio.h>

#define N 7   

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
    if (code != cudaSuccess) 
    {
        fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
        if (abort) exit(code);
    }
}

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

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

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

int main(){

    int array[N] = { 12, 13, 23, 24, 25, 32, 33};
    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));

    memset(new_array,0,(N-1)*N/2*sizeof(int));
    gpuErrchk(cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int)));
    gpuErrchk(cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice));

    for (int i = 0; i < N; i++)
        for(int j = i+1; j < N; j++)
        { 
            if((array[i]-array[i]%10) == (array[j]-array[j]%10))
                new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;           
        }

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

    printf("\n\n");

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

    gpuErrchk(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]);

    getchar();
    return 0;
}
为了您的方便,我在下面报告完整的代码以及初始化和CUDA错误检查,这是您在代码中忽略的一个重要方面:

memset(new_array,0,(N-1)*N/2*sizeof(int));
cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int));
#include <stdio.h>

#define N 7   

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
    if (code != cudaSuccess) 
    {
        fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
        if (abort) exit(code);
    }
}

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

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

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

int main(){

    int array[N] = { 12, 13, 23, 24, 25, 32, 33};
    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));

    memset(new_array,0,(N-1)*N/2*sizeof(int));
    gpuErrchk(cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int)));
    gpuErrchk(cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice));

    for (int i = 0; i < N; i++)
        for(int j = i+1; j < N; j++)
        { 
            if((array[i]-array[i]%10) == (array[j]-array[j]%10))
                new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;           
        }

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

    printf("\n\n");

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

    gpuErrchk(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]);

    getchar();
    return 0;
}
#包括
#定义n7
#定义gpuerchk(ans){gpuAssert((ans),_文件_,_行__)}
内联void gpuAssert(cudaError\u t代码,char*文件,int行,bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(标准,“GPUassert:%s%s%d\n”,cudaGetErrorString(代码)、文件、行);
如果(中止)退出(代码);
}
}
__全局无效内核(int*新数组,int*数组){
int i=threadIdx.x;
int j=螺纹内径x.y;
如果((j>i)和((数组d[i]-(数组d[i]%10))==(数组d[j]-(数组d[j]%10)))
新的数组d[i*N+(j-(i+1))-(i)*(i+1)/2]=数组d[i]*10+(数组d[j]%10);
}
int main(){
int数组[N]={12,13,23,24,25,32,33};
int新_数组[(N-1)*N/2]={0};
int*array_d;cudamaloc((void**)和array_d,N*sizeof(int));
int*新数组;cudamaloc((void**)和新数组(N-1)*N/2*大小(int));
memset(新的_数组,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemset(新的数组d,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemcpy(数组d,数组,N*sizeof(int),cudaMemcpyHostToDevice));
对于(int i=0;i
在以前版本的代码中,我的朋友得到了@jackolanten的帮助。我希望你能帮助我…-)如果你要发布代码,至少要努力确保它能编译……是的……我会小心的……谢谢你的帮助suggestion@user3319055你为什么不修改你发布的代码,让它编译呢?您可以编辑自己的问题-单击问题下方的
edit
链接。