Cuda程序不适用于超过1024个线程

Cuda程序不适用于超过1024个线程,cuda,gpu,nvidia,Cuda,Gpu,Nvidia,我的程序是奇偶合并排序,它的线程数不超过1024个 我已经尝试将块大小增加到100,但是对于超过1024个线程仍然无效 我正在使用Visual Studio 2012,我有Nvidia Geforce 610M。这是我的节目 #include<stdio.h> #include<iostream> #include<conio.h> #include <random> #include <stdint.h> #include <d

我的程序是奇偶合并排序,它的线程数不超过1024个

我已经尝试将块大小增加到100,但是对于超过1024个线程仍然无效

我正在使用Visual Studio 2012,我有Nvidia Geforce 610M。这是我的节目

#include<stdio.h>
#include<iostream>
#include<conio.h>
#include <random>
#include <stdint.h>
#include <driver_types.h >


__global__ void odd(int *arr,int n){
    int i=threadIdx.x;
    int temp;
    if(i%2==1&&i<n-1){
        if(arr[i]>arr[i+1])
        {
            temp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
        }
    }
}

__global__ void even(int *arr,int n){
    int i=threadIdx.x;
    int temp;
    if(i%2==0&&i<n-1){
        if(arr[i]>arr[i+1])
        {
            temp=arr[i];
            arr[i]=arr[i+1];
            arr[i+1]=temp;
        }
    }
}

int main(){
    int SIZE,k,*A,p,j;
    int *d_A;
    float time;

    printf("Enter the size of the array\n");
    scanf("%d",&SIZE);
    A=(int *)malloc(SIZE*sizeof(int));
    cudaMalloc(&d_A,SIZE*sizeof(int));
    for(k=0;k<SIZE;k++)
    A[k]=rand()%1000;


    cudaMemcpy(d_A,A,SIZE*sizeof(int),cudaMemcpyHostToDevice);
    if(SIZE%2==0)
        p=SIZE/2;
    else
        p=SIZE/2+1;


    for(j=0;j<p;j++){
        even<<<3,SIZE>>>(d_A,SIZE);
        if(j!=p-1)
            odd<<<3,SIZE>>>(d_A,SIZE);
        if(j==p-1&&SIZE%2==0)
            odd<<<1,SIZE>>>(d_A,SIZE);
    }


    cudaMemcpy(A,d_A,SIZE*sizeof(int),cudaMemcpyDeviceToHost);
    for(k=0;k<SIZE;k++)
        printf("%d ",A[k]);


    free(A);
    cudaFree(d_A);

    getch();

} 
#包括
#包括
#包括
#包括
#包括
#包括
__全局无效奇数(int*arr,int n){
int i=threadIdx.x;
内部温度;
如果(i%2==1&&iarr[i+1])
{
温度=arr[i];
arr[i]=arr[i+1];
arr[i+1]=温度;
}
}
}
__全局无效偶数(int*arr,int n){
int i=threadIdx.x;
内部温度;
如果(i%2==0&&iarr[i+1])
{
温度=arr[i];
arr[i]=arr[i+1];
arr[i+1]=温度;
}
}
}
int main(){
整数大小,k,*A,p,j;
int*d_A;
浮动时间;
printf(“输入数组的大小\n”);
scanf(“%d”,大小(&S);
A=(int*)malloc(SIZE*sizeof(int));
Cudamaloc(&d_A,尺寸*sizeof(int));
对于(k=0;kCUDA线程块为1024个线程(对于cc 1.x GPU,为512个线程)。线程块的大小在内核启动中的第二个内核配置参数中指示:

    even<<<3,SIZE>>>(d_A,SIZE);
             ^^^^
偶数(d_A,大小);
^^^^
因此,当您输入大于1024的
SIZE
值时,该内核将不会启动

您没有得到这方面的任何指示,因为您没有这样做,这在您遇到CUDA代码问题时总是一个好主意。您还可以使用
CUDA memcheck
运行代码以查找API错误,作为快速测试