10

CUDA では、ポインタがデバイスまたはホストのメモリを指しているかどうかを知る方法があります。

これの作成された操作例は次のとおりです。

int *dev_c, *host_c;
cudaMalloc( (void**)&dev_c, sizeof(int) );
host_c = (int*) malloc(sizeof(int));

もちろん名前を見ることはできますが、ポインタ dev_c と host_c を調べて、host_c がホストを指し、dev_c がデバイスを指すという方法はありますか。

4

4 に答える 4

9

(私が思うに)CUDA4とFermiGPUを起動します。NvidiaはUVA(Unified Virtual Address Space)をサポートしています。関数cudaPointerGetAttributesは、あなたが求めていることを正確に実行しているようです。これは、cudaHostAllocで割り当てられたホストポインターに対してのみ機能すると思います(cmallocでは機能しません)。

于 2013-02-16T07:59:26.720 に答える
4

これは、 Unified Virtual Addressingを使用して、ポインターがホストまたはデバイスのメモリ空間を指しているかどうかを検出する方法を示す小さな例です。@PrzemyslawZych が指摘したように、これは で割り当てられたホスト ポインターに対してのみ機能しますcudaMallocHost

#include<stdio.h>

#include<cuda.h>   
#include<cuda_runtime.h>

#include<assert.h>
#include<conio.h>

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
    if (code != cudaSuccess) 
    {
        fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
        getch();
        if (abort) { exit(code); getch(); }
    }
}

int main() {

    int* d_data;
    int* data; // = (int*)malloc(16*sizeof(int));
    cudaMallocHost((void **)&data,16*sizeof(int));

    gpuErrchk(cudaMalloc((void**)&d_data,16*sizeof(int)));

    cudaDeviceProp prop;
    gpuErrchk(cudaGetDeviceProperties(&prop,0));

    printf("Unified Virtual Addressing %i\n",prop.unifiedAddressing);

    cudaPointerAttributes attributes;
    gpuErrchk(cudaPointerGetAttributes (&attributes,d_data));
    printf("Memory type for d_data %i\n",attributes.memoryType);
    gpuErrchk(cudaPointerGetAttributes (&attributes,data));
    printf("Memory type for data %i\n",attributes.memoryType);

    getch();

    return 0;
}
于 2013-12-15T08:01:05.733 に答える
3

直接ではありません。1 つのアプローチは、デバイス ポインターのカプセル化クラスを記述して、デバイス ポインターとホスト ポインターがコード内で異なることを完全に明確にすることです。このアイデアのモデルは、Thrustテンプレート ライブラリで見ることができます。これには、device_ptrデバイス ポインターとホスト ポインターの型を明確に区別するために呼び出される型があります。

于 2013-02-15T11:35:43.907 に答える
0

私はそれが可能だとは思わない。ポインタはメモリ内のアドレスを指していますが、これがホストメモリかデバイスメモリかはわかりません。プログラムが起動すると、OSのメモリ内の(ほぼ)すべてのアドレスに配置できるため、推測することはできません。変数名に注意してください。

于 2013-02-15T09:55:48.223 に答える