2016-07-14 10 views
-5

私はGPUプログラミングのためのカスタムmallocを書く必要があります。これは正しく動作しますか?このカスタムmallocはOKですか?

void* malloc(int size, int* bytesUsed, uchar* memory){ 
    int startIdx = (*bytesUsed); 
    (*bytesUsed) += size; 
    return (void*)(memory+startIdx); 
} 

私はCプログラミングに新たなんだ、私はポインタ算術演算関連のエラーか何かを作ったかもしれない...アイデアはbytesUsedであるあなたがでそれをインクリメントして、最初のフリーアドレスのmemoryにあなたにインデックスを与えますsizeを呼び出し、インクリメントしたインデックスをポインタとして返します。

+0

POSIXをお使いの場合http://linux.die.net/man/2/sbrk – stackptr

+1

'free'が必要な場合はどうなりますか? –

+0

@OliverCharlesworth私は自由にする必要はありません。ワークグループが終了すると、すべてのメモリが確保され、次のワークグループに再利用されます。 (私はopenCLを使用しています)。 –

答えて

1

いくつかの問題があります。

  1. 最大の問題は、アライメントです。返されたポインタを整列させる必要があります。このmalloc()には、必要なポインタ型が指定されていないため、すべてのコンテキスト "C11dr§7.192.実装でサポートされているような大きさのオブジェクト型のmax_align_t"を使用してください。注:*bytesUsedもこの配置が必要です。したがって、他のコードがそれに影響を及ぼす場合は、同様のコードを適用してください。

    if (size%sizeof(max_align_t)) { 
        size += sizeof(max_align_t) - size%sizeof(max_align_t); 
    } 
    // or 
    size = (size + sizeof(max_align_t) - 1)/sizeof(max_align_t)*sizeof(max_align_t); 
    
  2. メモリ不足が検出されません。

  3. 標準ライブラリ名を使用しないでください。必要に応じて後でコードをdefineにすることができます。

    // void* malloc(int size, int* bytesUsed, uchar* memory); 
    void* RG_malloc(int size, int* bytesUsed, uchar* memory); 
    
    // if needed 
    #define malloc RF_malloc 
    
  4. malloc()は、割り当てのために異なるタイプを期待:size_tintありません。

    // void* malloc(int size, int* bytesUsed, uchar* memory); 
    void* malloc(size_t size, size_t* bytesUsed, uchar* memory); 
    
  5. キャストは必要ありません。

    // return (void*)(memory+startIdx); 
    return memory + startIdx; 
    
  6. うまくいけば、何か他のものではありませんこれは、ucharよりもunsigned charを使用することがより明確に。

void* malloc(size_t size, size_t* bytesUsed, unsigned char* memory){ 
    size = (size + sizeof(max_align_t) - 1)/sizeof(max_align_t)*sizeof(max_align_t); 
    if (RG_ALLOC_SIZE - *bytesUsed > size) { 
    return NULL; 
    } 
    size_t startIdx = *bytesUsed; // See note above concerning alignment. 
    *bytesUsed += size; 
    return memory + startIdx; 
} 

はまた、RG_free()が符号化されていないすべて一緒にこれを置きます。それが必要な場合、この単純な割り当て方式には重要な追加が必要です。

2

私はこの単純なスタックベースのソリューションは、あなた

#include <stdint.h> 
const size_t ALLOCSIZE = 1024; 
typedef uint8_t byte; 

static byte buf[ALLOCSIZE]; 
static byte *pbuf = buf; 

byte *alloc(size_t n) 
{ 
    /* if there is room */ 
    if (buf + ALLOCSIZE - pbuf >= n) { 
     pbuf += n; 
     return pbuf - n; 
    } else 
     return NULL; 
} 

のために働くかどうかわからないんだけど、あなたが割当てを解除する必要はないと言ったので、私は、freeを提供していませんでした。

関連する問題