2016-10-19 3 views
-1

How to find the sum of array in CUDA by reduction을 참조하여 코드에서 감소 논리를 사용합니다.오류가 발생했습니다.

하지만 약간의 오차가 있습니다. 나는 내 실수를 저 지르지 않고있다. 나를 도울 수 있니?

요구 사양 : 1.Cuda 2. 그래픽 툴킷 V6.5 : GTX210 (연산 능력 1.2) 2013

#include<stdio.h> 
#include<cuda.h> 
#include<malloc.h> 
#include<conio.h> 
#include<time.h> 
#include<windows.h> 

#define SIZE 10 
#define N 100 

__global__ void vectoreAdd(int *d_a, int *d_b, int *d_c) 
{ 
    __shared__ int sdata[256]; 

    int i = threadIdx.x + (blockIdx.x*blockDim.x); 

    sdata[threadIdx.x] = d_a[i]; 
    __syncthreads(); 

    if (i<SIZE) 

    for (i = 2; i<SIZE; i++) 
    { 
     int counter = 0; 
     for (int j = 2; j<d_a[i]; j++) 
     { 
      if (d_a[i] % j == 0) 
      { 
      counter = 1; break; 
      } 
     } 
if (counter == 0) 
     { 
      d_b[i] = d_a[i]; 
     } 

    } 
    // do reduction in shared mem 
    for (int s = 1; s < blockDim.x; s *= 2) 
    { 
     int index = 2 * s * threadIdx.x;; 

     if (index < blockDim.x) 
     { 
      sdata[index] += sdata[index + s]; 
     } 
     __syncthreads(); 
    } 

    // write result for this block to global mem 
    if (threadIdx.x == 0) 
     atomicAdd(d_c, sdata[0]); 
} 

} 
int main() 
{ 
    clock_t tic = clock(); 
    int *a, *b, *summation=0, sum = 0,count=-1;  //declare summation as double/long if needed 
    int *d_a, *d_b, *d_c; 

    //int blocks, block_size = 512; 

    int size = N * sizeof(int); 

    a = (int *)malloc(SIZE*sizeof(int)); 
    b = (int *)malloc(SIZE*sizeof(int)); 
    summation = (int *)malloc(SIZE*sizeof(int)); 


    cudaMalloc((void**)&d_a, SIZE * sizeof(int)); 
    cudaMalloc((void**)&d_b, SIZE * sizeof(int)); 
    cudaMalloc((void**)&d_c, SIZE * sizeof(int)); 


    for (int i = 1; i<SIZE; i++) 
    { 
     a[i] = i; 
     b[i] = 0; 

    } 

    cudaMemcpy(d_a, a, SIZE*sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_b, b, SIZE*sizeof(int), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_c, c, SIZE*sizeof(int), cudaMemcpyHostToDevice); 
    /*blocks = SIZE/block_size; 
    if (SIZE% block_size != 0) 
     blocks++; */ 

    dim3 blocksize(256); // create 1D threadblock 
    dim3 gridsize(N/blocksize.x); //create 1D grid 

    vectoreAdd << < gridsize, blocksize >> >(d_a, d_b, d_c); 


    //cudaThreadSynchronize(); 

    cudaMemcpy(b, d_b, SIZE*sizeof(int), cudaMemcpyDeviceToHost); 
    cudaMemcpy(summation, d_c, SIZE*sizeof(int), cudaMemcpyDeviceToHost); 

    for (int m = 0; m < SIZE; m++) 
    { 
     if (b[m] != 0) 
     { 
      printf("\n prime no is:%d", b[m]); 
      count = count + 1; 
     } 
    } 
    printf("\n\n Total prime no. are: %d", count); 
/*  for (int j = 1; j<SIZE; j++) 
    { 
     sum = sum + b[j]; 
    }*/ 

    printf("\n \nsum of all prime no upto %d is:%d", SIZE, summation); 

    clock_t toc = clock(); 
    printf("\n\nElapsed: %f seconds\n", (double)(toc - tic)/CLOCKS_PER_SEC); 

    free(a); free(b); free(summation); 
    cudaFree(d_a);  cudaFree(d_b);  cudaFree(d_c); 

    getchar(); return 0; 
} 

[/code] 
+1

무엇이 오류입니까? 가장 큰 문제는 'N'의 값이 너무 작아서 ('blocksize.x'보다 작다.) 결과적으로 정수 나누기 ('100/256')로 인해 크기가'0 '인 그리드가 생성된다는 것이다. '0'과 같다). – sgarizvi

+0

항상 [적절한 CUDA 오류 검사]를 사용해야합니다 (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime- api) CUDA 코드에 문제가 있으면 언제든지 도움말을 요청하기 전에'cuda-memcheck' *로 코드를 실행하십시오. 오류 출력을 이해하지 못하더라도 다른 사용자가 오류를 출력하는 데 도움이됩니다. 위의 프로그램에서 –

+0

난 단지 하나의 커널을 사용하므로 감축 추가 또는 프라임 번호 찾기를 혼란스럽게했다. 수정 된 코드에서 두 개의 다른 커널을 생성한다. – Rupali

답변

-1

코드에서 실수가 많이 있습니다 3. 비주얼 스튜디오 :

cudaMalloc ((void **) & d_a, SIZE * sizeof (int));

는 같아야

cudaMalloc ((보이드 **) & d_a, N *를 sizeof (INT)); // OR

cudaMalloc ((void **) & d_a, size);

귀하가 이미 계산했으나 통과하지 못했습니다. malloc()의 경우와 동일 // 호스트 코드

관련 문제