Cuda 程序不适用于超过 1024 个线程
Cuda program not working for more than 1024 threads
我的程序是 Odd-even merge sort
的,它不能用于超过 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();
}
CUDA 线程块是 limited 到 1024 个线程(或 512 个线程,对于 cc 1.x gpus)。线程块的大小在内核启动中的第二个内核配置参数中指示:
even<<<3,SIZE>>>(d_A,SIZE);
^^^^
因此,当您输入大于 1024 的 SIZE
值时,此内核将不会启动。
您没有得到任何指示,因为您没有执行 proper cuda error checking 每当您在 CUDA 代码上遇到问题时,这总是一个好主意。作为快速测试,您还可以 运行 您的代码 cuda-memcheck
以查找 API 错误。
我的程序是 Odd-even merge sort
的,它不能用于超过 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();
}
CUDA 线程块是 limited 到 1024 个线程(或 512 个线程,对于 cc 1.x gpus)。线程块的大小在内核启动中的第二个内核配置参数中指示:
even<<<3,SIZE>>>(d_A,SIZE);
^^^^
因此,当您输入大于 1024 的 SIZE
值时,此内核将不会启动。
您没有得到任何指示,因为您没有执行 proper cuda error checking 每当您在 CUDA 代码上遇到问题时,这总是一个好主意。作为快速测试,您还可以 运行 您的代码 cuda-memcheck
以查找 API 错误。