2013-02-04 2 views
0

배열의 첫 번째 요소 만 5.0 (말)으로 설정하려고합니다. 즉, 스레드 중 하나만 값을 설정하고 나머지 스레드는 나머지를 수행하지 않습니다.CUDA 프로그래밍 할당

여기에 내가 이것을 실행하면, 파일이 모두 0이 포함되어 내 전체 코드

#include <stdio.h> 
#include <cuda.h> 

#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); 
    } 
} 

void writeBuf(char * fName, float * out_frame, int dim) 
{ 
    FILE * fp = fopen(fName, "w+"); 
    int baseIndx = 0; 
    for(int i=0 ; i<dim ; i++) 
    { 
     for(int j=0 ; j<dim ; j++) 
     { 
      fprintf(fp, "%f ", out_frame[ dim + j ]); 
     } 
     baseIndx += dim; 
     fprintf(fp, "\n"); 
    } 
    fclose(fp); 

} 

__global__ void kernel(float * s1, float * s2, int dim, int * hx, int *hy, float *hT, int nHeaters) 
{ 
    int x = threadIdx.x + blockIdx.x*blockDim.x; 
    int y = threadIdx.y + blockIdx.y*blockDim.y; 
    int offset = x + y*blockDim.x*gridDim.x; 


    if(offset < 1) 
    { 
    s2[0] = 1.0; 
    } 

    __syncthreads(); 

} 



int main() 
{ 
    srand48(time(NULL)); 
    int dim = 1024; 

    float *dev_s1, *dev_s2; 
    GPUERRCHK(cudaMalloc((void**)&dev_s1, dim*dim * sizeof(float))); 
    GPUERRCHK(cudaMalloc((void**)&dev_s2, dim*dim * sizeof(float))); 
    GPUERRCHK(cudaMemset(dev_s1, 0x00, dim*dim * sizeof(float))); 
    GPUERRCHK(cudaMemset(dev_s2, 0x00, dim*dim * sizeof(float))); 



    //heaters 
    int *dev_hx, *dev_hy; 
    float *dev_hT; 
    int nHeaters = 20; 
    GPUERRCHK(cudaMalloc((void**)&dev_hx, nHeaters * sizeof(int))); 
    GPUERRCHK(cudaMalloc((void**)&dev_hy, nHeaters * sizeof(int))); 
    GPUERRCHK(cudaMalloc((void**)&dev_hT, nHeaters * sizeof(float))); 


    //init heaters on cpu 
    int * hx, *hy; 
    float * hT; 
    hx = (int*) malloc(nHeaters * sizeof(int)); 
    hy = (int*) malloc(nHeaters * sizeof(int)); 
    hT = (float*) malloc(nHeaters * sizeof(float)); 
    for(int i=0 ; i<nHeaters ; i++) 
    { 
    hx[i] = (int) ((float)drand48() * (float)dim) + 5; 
    hy[i] = (int) (drand48() * dim) + 5; 
    hT[i] = (float) (drand48() * 100) + 50; 
    } 

    //transfer hx, hy, hT to GPU 
    GPUERRCHK(cudaMemcpy(dev_hx, hx, nHeaters * sizeof(int), cudaMemcpyHostToDevice)); 
    GPUERRCHK(cudaMemcpy(dev_hy, hy, nHeaters * sizeof(int), cudaMemcpyHostToDevice)); 
    GPUERRCHK(cudaMemcpy(dev_hT, hT, nHeaters * sizeof(float), cudaMemcpyHostToDevice)); 


    float *out_frame = (float *) malloc(dim*dim*sizeof(float)); 


    // run kernel 
    int nThreadsPerBlock = 16; 
    int nBlockX = (dim+nThreadsPerBlock-1)/nThreadsPerBlock; 
    int nBlockY = (dim+nThreadsPerBlock-1)/nThreadsPerBlock; 
    kernel<<< dim3(nBlockX, nBlockY), dim3(nThreadsPerBlock, nThreadsPerBlock) >>>(dev_s1, dev_s2, dim, dev_hx, dev_hy, dev_hT, nHeaters); 
    GPUERRCHK(cudaPeekAtLastError()); 
    GPUERRCHK(cudaDeviceSynchronize()); 


    // collect result 
    GPUERRCHK(cudaMemcpy(out_frame, dev_s2, dim*dim * sizeof(float), cudaMemcpyDeviceToHost)); 


    int f=1; 
    char fName[100]; 
    snprintf(fName, 100, "out/file_%04d.data", f); 
    writeBuf(fName, out_frame, dim); 


    cudaFree(dev_s1); 
    cudaFree(dev_s2); 

    free(out_frame); 
} 

입니다. 달성하려는 계획을 어떻게 성취합니까? 무엇이 문제 일 수 있습니까?

+0

과 :
올바른 행은 다음과 가능한 한 최소) 문제가 있습니다. 왜냐하면 여러분이 명확하게 게시 한 것은 컴파일 및 실행중인 코드가 아니기 때문입니다. ..... – talonmies

+0

지금 컴파일하고있는 정확한 코드를 넣었습니다. 도와주세요..! – mkuse

답변

1

귀하의 문제가 writeBuf에 (..) @line :

fprintf(fp, "%f ", out_frame[ dim + j ]); 

희미한는 1024과 1024에서 1024 +에 액세스하는 요소-1을 어둡게하고 첫 번째 요소를 보지 못할 이유입니다. 당신은 질문, * 실제 코드 * 당신이 게시 확인하십시오 "내 코드가 작동하지 않습니다"(그 코드는 간결해야한다 게시하려는 경우

fprintf(fp, "%f ", out_frame[ baseIndx + j ]); 
+0

네, 내 실수있어, 고마워 !!. 매우 어리 석다. .... :( – mkuse