2

カーネル内の新しい演算子を使用して、誰かがこの動作に光を当てることができるかどうか疑問に思っていました..以下はコードです

#include <stdio.h>
#include "cuda_runtime.h"
#include "cuComplex.h"
using namespace std;
__global__ void test()
{

    cuComplex *store;
    store= new cuComplex[30000];
    if (store==NULL) printf("Unable to allocate %i\n",blockIdx.y);
    delete store;
    if (threadIdx.x==10000) store->x=0.0;
}

int main(int argc, char *argv[])
{
    float timestamp;
    cudaEvent_t event_start,event_stop;
    // Initialise


    cudaEventCreate(&event_start);
    cudaEventCreate(&event_stop);
    cudaEventRecord(event_start, 0);
    dim3 threadsPerBlock;
    dim3 blocks;
    threadsPerBlock.x=1;
    threadsPerBlock.y=1;
    threadsPerBlock.z=1;
    blocks.x=1;
    blocks.y=500;
    blocks.z=1;

    cudaEventRecord(event_start);
    test<<<blocks,threadsPerBlock,0>>>();
    cudaEventRecord(event_stop, 0);
    cudaEventSynchronize(event_stop);
    cudaEventElapsedTime(&timestamp, event_start, event_stop);
    printf("test took  %fms \n", timestamp);
}

これを GTX680 Cuda 5 で実行し、出力を調査すると、メモリがランダムに割り当てられていないことがわかります:( すべてのグローバル メモリが終了したためではないかと考えていましたが、2GB のメモリがあり、アクティブなブロックの最大量が16 この方法で割り当てられるメモリの量は、最大で 16*30000*8=38.4x10e6.. つまり約 38Mb です。

4

1 に答える 1

2

この問題は、malloc()およびfree()デバイスシステムコールによって使用されるヒープのサイズに関連しています。詳細についてはsection 3.2.9 Call Stackappendix B.16.1 Heap Memory Allocation『NVIDIA CUDA Cプログラミングガイド』を参照してください。

カーネル要件に合うようにヒープサイズを設定すると、テストは機能します

    cudaDeviceSetLimit(cudaLimitMallocHeapSize, 500*30000*sizeof(cuComplex));
于 2012-10-25T17:06:04.077 に答える