2

私は実験をしようとしています。2つのアプリケーションがあります。あるアプリケーションでは、ヒープ メモリをデフォルトの 8MB から 4MB に変更し、カーネルを起動して、最後にビジー状態で待機します。別のアプリケーションでは、デバイスのヒープ メモリのサイズを照会するだけです。興味深いのは、カーネル起動後の最初のアプリケーションでは 4MB を取得し続け、他のアプリケーションでは 8MB を取得し続けていることです。なんでそうなの?

アプリケーション 1 のコードは -

__global__ void kernelA()
{
    printf("I am running on kernelA\n");
}
int main()
{
    size_t size;
    cudaDeviceSetLimit(cudaLimitMallocHeapSize,100*sizeof(float));
    cudaDeviceGetLimit(&size, cudaLimitMallocHeapSize);
    printf("Heap size found to be %dn",(int)size);
    kernelA<<<1,10>>>();
    cudaThreadSynchronize();
    while(1)
    {           
        cudaDeviceGetLimit(&size, cudaLimitMallocHeapSize);
        printf("Heap size found to be %d\n",(int)size); 
    }
}

アプリケーション 2 のコードは -

int main()
{
    int k=1;
    size_t size;    
    for(k=1;k<1000000;k++)
    {
        cudaDeviceGetLimit(&size, cudaLimitMallocHeapSize);
        printf("Heap size found to be %d\n",(int)size);     
    }
}
4

1 に答える 1

1

CUDA ランタイム API 呼び出しは、特定のデバイスに関連付けられている呼び出しプロセスの CUcontext にのみ影響します。cudaDevice* は、同じ CUDA デバイスで実行されている可能性がある同じプロセス内の他のプロセスまたは他の CUcontext の状態に直接影響しません。

于 2012-06-01T23:14:41.620 に答える