2011-09-17 5 views
-2

私がやろうとしていることはとても簡単です。 各スレッドは、グローバルメモリに格納されたグローバル配列からサブ配列を読み取ります。 それはいくつかの計算を行い、静的配列に結果を格納します。 最後に出力はグローバルメモリ の別の配列に格納されています。コードに示されているカーネルのrun.asというグローバル配列に静的配列を書き込む行をコメントします。 アイデア?CUDA「不明な起動失敗」メモリへのアクセス

GPUカーネル:

#ifndef _TEMPLATE_KERNEL_H_ 
#define _TEMPLATE_KERNEL_H_ 

#include <stdio.h> 

__device__ void 
DecompressBlockGPU(unsigned char *compressed_block,unsigned char *compressed_size, 
        int array_length,unsigned char *decompressed_block) 
{  
    int j = 0; 

    for(int i = 0 ; i < array_length ;i++) 
    { 
     for(int idx = 0 ; idx < compressed_size[i]; idx++) 
     { 
      decompressed_block[j] = compressed_block[i]; 
      j++; 
     } 
    } 
} 
__global__ void 

gpu_test(unsigned char *compressed_data,int *OffsetsArray,int xBlocks,int yBlocks, 
     unsigned char *output, int BlockSize,int BlockWidth,int BlockHeight, 
     int cols,int xTB,int yTB,int xTH,int yTH,unsigned char *aux_array) 
{ 
    int x_max = xBlocks ; 
    int y_max = yBlocks ; 

    int x_block = blockIdx.x ; 
    int y_block = blockIdx.y ; 

    x_max = gridDim.x*blockDim.x ; 
    y_max = gridDim.y*blockDim.y ; 

    x_block = (blockIdx.x*xTH); 
    y_block = (blockIdx.y*yTH); 
    int x_block1 = x_block + threadIdx.x; 
    int y_block1 = y_block + threadIdx.y; 

    int block_idx = y_block1*xBlocks + x_block1; 
    unsigned char *temp_ptr = compressed_data + OffsetsArray[block_idx];   
    int *array_length = (int *)temp_ptr; 
    unsigned char *compressed_size = compressed_data + OffsetsArray[block_idx] + 
           array_length[0] +sizeof(int)/sizeof(unsigned char); 
    unsigned char *compressed_block = compressed_data + OffsetsArray[block_idx] + 
           sizeof(int)/sizeof(unsigned char); 

    aux_array = aux_array + (BlockWidth+2)*(BlockHeight+2)*block_idx; 
    aux_array[block_idx]=array_length[0]; 

    unsigned char decompressed_block[72]; 
    unsigned char extracted_block[32]; 

    DecompressBlockGPU(compressed_block,compressed_size,array_length[0], 
          &decompressed_block[0]); 

    if(block_idx == 0) 
    { 
     for(int i=0;i<16;i++) aux_array[i]= decompressed_block[i]; //fails 
     for(int i=16;i<16*36;i++) aux_array[i]=1;//works 
    } 
} 
#endif 

CPU機能:?

unsigned char *runGPU(unsigned char *d_compressed_data,int *OffsetsArray,int xBlocks,int yBlocks,unsigned char *h_output) 
{ 


    printf("xBlocks =%d yBlocks =%d \n",xBlocks,yBlocks); 



    int xTB = 4; 
    int yTB = 4; 
    int xTH = 1; 
    int yTH = 1; 



    unsigned char *d_output; 
    unsigned char *d_aux_array; 
    unsigned char *h_aux_array; 

    int mem_size = image_len*sizeof(unsigned char); 
    int big_mem_size = sizeof(unsigned char)*xBlocks*yBlocks*(BlockWidth+2)*(BlockHeight+2); 

    cutilSafeCall(cudaMalloc((void**) &d_output, mem_size)); 
    cutilSafeCall(cudaMalloc((void**) &d_aux_array,big_mem_size)); 
    h_aux_array = (unsigned char *)malloc(big_mem_size); 


    float time = 0; 
    float totalTime = 0; 
    cudaEvent_t start_event4, stop_event4; 
    cutilSafeCall(cudaEventCreate(&start_event4)); 
    cutilSafeCall(cudaEventCreate(&stop_event4)); 
    cutilSafeCall(cudaEventRecord(start_event4, 0)); 

    dim3 grid(xTB,yTB, 1); 
    dim3 threads(xTH, yTH, 1); 

    gpu_test<<<grid,threads>>>(d_compressed_data,OffsetsArray,xBlocks,yBlocks,d_output,BlockSize,BlockWidth,BlockHeight,cols,xTB,yTB,xTH,yTH,d_aux_array); 
    cudaThreadSynchronize(); 

    cutilSafeCall(cudaEventRecord(stop_event4, 0)); 
    cutilSafeCall(cudaEventSynchronize(stop_event4)); 
    time = 0; 
    cutilSafeCall(cudaEventElapsedTime(&time, start_event4, stop_event4)); 
    totalTime += time; 
    totalTime /= (1.0e3 * 1); 
    shrLogEx(LOGBOTH | MASTER, 0, "GPU decompression Time = %.5f \n",totalTime); 

    cutilSafeCall(cudaMemcpy(h_output,d_output, mem_size, cudaMemcpyDeviceToHost)); 
    cutilSafeCall(cudaMemcpy(h_aux_array,d_aux_array, big_mem_size, cudaMemcpyDeviceToHost)); 


    cudaFree(d_output); 
    cudaFree(d_aux_array); 

    return h_aux_array; 

} 

それが今明らかである

+1

質問を編集して*意味のある*コードを含めることができますか?あなたが投稿したものから何が間違っているかについて何かを言うことは絶対不可能です。問題を再現する簡潔でコンパイル可能なコードを投稿してから、いくつかの有用な提案を得るかもしれません。 – talonmies

+0

詳細が必要ですか? – Morad

+0

詳細、異なる詳細はありません。ランタイムエラーについて質問していますが、投稿したコードはコンパイルまたは実行できないため、誰でもあなたを助けることはできません。 – talonmies

答えて

3

cuda-memcheckを通して、あなたのプログラムを実行してみてください(またはメモリがあなたの場合はチェックを有効(編集後) Parallel Nsightを使用しています)。