2011-05-12 8 views
1

J'ai un problème avec mon code OpenCL. Je compile et l'exécute sur le processeur (noyau 2 duo) Mac OS X 10.6.7. Voici le code:OpenCL Erreur de bus

#define BUFSIZE (524288) // 512 KB 
#define BLOCKBYTES (32) // 32 B 
__kernel void test(__global unsigned char *in, 
        __global unsigned char *out, 
        unsigned int srcOffset, 
        unsigned int dstOffset) { 
    int grId = get_group_id(0); 
    unsigned char msg[BUFSIZE]; 
    srcOffset = grId * BUFSIZE; 
    dstOffset = grId * BLOCKBYTES; 

    // Copy from global to private memory 
    size_t i; 
    for (i = 0; i < BUFSIZE; i++) 
     msg[i] = in[ srcOffset + i ]; 

    // Make some computation here, not complicated logic  

    // Copy from private to global memory 
    for (i = 0; i < BLOCKBYTES; i++) 
     out[ dstOffset + i ] = msg[i]; 
} 

Le code m'a donné une erreur d'exécution "erreur de bus". Quand je fais imprimer printf en cycle qui copient de la mémoire globale à la mémoire privée puis voir là l'erreur se produit, chaque fois dans l'itération différente de i. Lorsque je réduis la taille de BUFSIZE à 262144 (256 Ko) alors le code fonctionne bien. J'ai essayé d'avoir un seul item de travail sur un groupe de travail. Les * points dans la zone de mémoire qui ont des milliers de Ko de données. Je soupçonne de limiter la mémoire privée, mais ensuite jeté une erreur dans l'allocation de la mémoire, pas lors de la copie.

Voici mon appareil OpenCL requête:

-

-------------------------------- 
Device Intel(R) Core(TM)2 Duo CPU  P7550 @ 2.26GHz 
--------------------------------- 
    CL_DEVICE_NAME:   Intel(R) Core(TM)2 Duo CPU  P7550 @ 2.26GHz 
    CL_DEVICE_VENDOR:    Intel 
    CL_DRIVER_VERSION:   1.0 
    CL_DEVICE_VERSION:   OpenCL 1.0 
    CL_DEVICE_TYPE:   CL_DEVICE_TYPE_CPU 
    CL_DEVICE_MAX_COMPUTE_UNITS:  2 
    CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: 3 
    CL_DEVICE_MAX_WORK_ITEM_SIZES: 1/1/1 
    CL_DEVICE_MAX_WORK_GROUP_SIZE: 1 
    CL_DEVICE_MAX_CLOCK_FREQUENCY: 2260 MHz 
    CL_DEVICE_ADDRESS_BITS:  32 
    CL_DEVICE_MAX_MEM_ALLOC_SIZE:  1024 MByte 
    CL_DEVICE_GLOBAL_MEM_SIZE:  1535 MByte 
    CL_DEVICE_ERROR_CORRECTION_SUPPORT: no 
    CL_DEVICE_LOCAL_MEM_TYPE:  global 
    CL_DEVICE_LOCAL_MEM_SIZE:  16 KByte 
    CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte 
    CL_DEVICE_QUEUE_PROPERTIES:  CL_QUEUE_PROFILING_ENABLE 
    CL_DEVICE_IMAGE_SUPPORT:  1 
    CL_DEVICE_MAX_READ_IMAGE_ARGS: 128 
    CL_DEVICE_MAX_WRITE_IMAGE_ARGS: 8 
    CL_DEVICE_SINGLE_FP_CONFIG:  denorms INF-quietNaNs round-to-nearest 

    CL_DEVICE_IMAGE <dim>   2D_MAX_WIDTH  8192 
        2D_MAX_HEIGHT 8192 
        3D_MAX_WIDTH  2048 
        3D_MAX_HEIGHT 2048 
        3D_MAX_DEPTH  2048 

    CL_DEVICE_EXTENSIONS:   cl_khr_fp64 
        cl_khr_global_int32_base_atomics 
        cl_khr_global_int32_extended_atomics 
        cl_khr_local_int32_base_atomics 
        cl_khr_local_int32_extended_atomics 
        cl_khr_byte_addressable_store 
        cl_APPLE_gl_sharing 
        cl_APPLE_SetMemObjectDestructor 
        cl_APPLE_ContextLoggingFunctions 

    CL_DEVICE_PREFERRED_VECTOR_WIDTH_<t> CHAR 16, SHORT 8, INT 4, LONG 2, FLOAT 4, DOUBLE 2 

Répondre

1

Vous utilisez un msg variable une taille de 512 Ko. Cette variable doit être dans la mémoire privée. La mémoire privée n'est pas si grande. Cela ne devrait pas fonctionner, autant que je sache.

Pourquoi avez-vous les paramètres srcOffset et dstOffset? Vous ne les utilisez pas.

Je ne vois pas plus de problèmes. Essayez d'allouer de la mémoire locale. Avez-vous une version de votre code sans optimisation en cours d'exécution? Une version qui calcule juste dans la mémoire globale?