2013-08-28 3 views
-1

Я пытаюсь найти максимум массива. Я взял помощь от CUDA Maximum Reduction Algorithm Not Working. и сделать некоторые собственные модификации. Однако я запускаю его для 16 данных. Я нахожу, что в коде ядра общая память копирует только 1-й 4data. отдых потерян. Я помещаю две данные cuPrintf..1st printf в их общую память. Но второй cuPrintf только после того, как __syncthreads .. и что показывает 0 из идентификаторов нитей 4 onwords .. Просьба помочь #include #include #include #include #include #include "cuPrintf.cu" #include " cuPrintf.cuh "Я потерял данные после __syncthreads() в cuda

__device__ float MaxOf2(float a, float b) 
{ 
    if(a > b) return a; 
    else   return b; 
} 

__global__ void findMax(int size,float *array_device , float *outPut) 
{ 
    extern __shared__ float sdata[]; 
    int tid = threadIdx.x; 
    int i = blockIdx.x*blockDim.x + threadIdx.x; 

    if(i< size) 
    { 
    sdata[tid] = array_device[i]; 
    cuPrintf(" array_d[%d]===%f, sdata[%d]===%f\n ",i,array_device[i],tid,sdata[tid]); 
    __threadfence(); 

    } 
    __syncthreads(); 

    if(tid<size) 
     cuPrintf(" array_d[%d]===%f, sdata[%d]===%f\n ",i,array_device[i],tid,sdata[tid]); 

    for (int s=blockDim.x/2; s>0; s=s>>1)//s=blockDim.x/2 
    { 
     if (tid < s) 
     { 
      sdata[tid]= MaxOf2(sdata[tid],sdata[tid+s]); 

     } 

     __syncthreads(); 
    } 
    if (tid == 0) outPut[blockIdx.x] = sdata[0]; 

} 

int main() 
{ 
    long double M = pow(2,20); 
    long double N = 2; 
    int noThreadsPerBlock = 512 ; 
    printf("\n Provide the array Size N.(array will be of size N * 2^20) :-"); 
    scanf("%Lf",&N); 
    long int size = 16; 
    int numOfBlock = (int)size /noThreadsPerBlock + 1; 
    printf("\n num of blocks==%ld",numOfBlock); 

    float *array_device , *outPut; 
    float array_host[]={221,100,2,340,47,36,500,1,33,4460,5,6,7,8,9,11}; 
    cudaMalloc((void **)&array_device, size*sizeof(float)); 
    cudaMalloc((void **)&outPut, size*sizeof(float)); 
    cudaError_t error0 = cudaGetLastError(); 
    printf("\n 0CUDA error: %s\n", cudaGetErrorString(error0)); 
    printf("size===%ld",size); 

    cudaMemcpy(array_device, array_host, size*sizeof(float), cudaMemcpyHostToDevice); 
    cudaError_t error1 = cudaGetLastError(); 
    printf("\n1CUDA error: %s\n", cudaGetErrorString(error1)); 


    while(size>1) 
    { 
     cudaPrintfInit(); 
     findMax<<< numOfBlock,noThreadsPerBlock>>>(size,array_device, outPut);cudaPrintfDisplay(stdout, true); 
     cudaPrintfEnd(); 
     cudaError_t error2 = cudaGetLastError(); 
     printf(" 2CUDA error: %s\n", cudaGetErrorString(error2)); 
     cudaMemcpy(array_device, outPut, size*sizeof(float), cudaMemcpyDeviceToDevice); 
     size = numOfBlock; 
     printf("\n ****size==%ld\n",size); 
     numOfBlock = (int)size /noThreadsPerBlock + 1; 
    } 

    cudaMemcpy(array_host, outPut, size*sizeof(float), cudaMemcpyDeviceToHost); 
    cudaError_t error3 = cudaGetLastError(); 
    printf("\n3CUDA error: %s\n", cudaGetErrorString(error3)); 
    for(int i=0;i<size;i++) 
      printf("\n index==%d ;data=%f ",i,array_host[i]); 
    return 0; 
} 
+3

Во-первых, вы не указали динамический размер разделяемой памяти при запуске ядра. Он должен выглядеть так: 'findMax <<< numOfBlock, noThreadsPerBlock, sizeof (float) * noThreadsPerBlock >>>' Во-вторых, какова была концепция за условием 'if (tid Maku

+4

Действительно ли необходимо опубликовать много строк прокомментированного кода? Вы просите нас прочитать и исправить свой код, по крайней мере, потратьте время на его правильное форматирование, чтобы нам было легко читать. Помогите нам помочь вам ..... – talonmies

+0

Я полагаю, что если условие просто запретить так много печати, как у меня есть только 16 данных. Я попытался вывести вывод ... но получить некоторую проблему, чтобы сохранить его, поскольку он дает «некоторый код там ...». –

ответ

3

Я отправляю свой комментарий в виде ответа в соответствии с запросом.

Во-первых, вы не указали динамический размер разделяемой памяти при запуске ядра. Это должно выглядеть примерно так: findMax<<< numOfBlock,noThreadsPerBlock,sizeof(float)*noThreadsPerBlock>>>

Во-вторых, какова была концепция состояния if(tid<size) на второй cuPrintf? Предоставление вывода программы также может помочь.

+0

Спасибо за ответ. Это помогает нам получить эти заброшенные вопросы из списка без ответа. – talonmies

Смежные вопросы