0

本の CUDA By Example の 26 ページには、次のように書かれています。

cudaMalloc() で割り当てられたポインターを、ホストで実行される関数に渡すことができます。

cudaMalloc() で割り当てられたポインタを使用して、ホスト上で実行されるコードからメモリを読み書きすることはできません。

最初の概念を示すために、ここにコードを書いています。

main()
{
int * ad, N;

cudaMalloc((void **)&ad, Sizeof(int) *N);

GPUFunction<<<...>>>(ad);
Hostfunction(ad);

}


Hostfunction(int * AD)

{

int c ;

c=AD[N-1];

printf("%d", c);

}


  __global__ void GPUFunction(int *AD)

{

AD[threadIdx.x]= threadidx.x;
}

これは、上記のポイント 1 で説明されていることですか? その場合、上記のポイント 2 と矛盾します。ホスト関数がメモリ ad を読み取っていることがわかります。では、私の理解はどこで間違っているのでしょうか。

4

2 に答える 2

2

ホスト関数がメモリを読み込んでいることがわかりませad。あなたは確かにそれを行おうとするコードを書きましたが、それは無効なコードであり、セグ フォールトになります。

ここで提供したコードは完全でもコンパイル可能でもないため、何も示していません。

入力した内容にかなり近いコンパイル可能な例を次に示します。これはHostfunction、渡されたときに正しく機能しないことを示していadます。

$ cat t251.cu
#include <stdio.h>

  __global__ void GPUFunction(int *AD)

{

AD[threadIdx.x]= threadIdx.x;
}

void Hostfunction(int * AD, int N)

{

int c ;

printf("preparing to read ad in host code\n");
c=AD[N-1];

printf("%d", c);

}

int main()
{
int * ad, N;
N = 1;
cudaMalloc((void **)&ad, sizeof(int) *N);

GPUFunction<<<1,1>>>(ad);
Hostfunction(ad, N);

}


$ nvcc -arch=sm_20 -o t251 t251.cu
$ ./t251
preparing to read ad in host code
Segmentation fault (core dumped)
$
于 2013-10-04T15:48:50.077 に答える
2

2つの点は矛盾していません。

最初のポイントは単に、ADポインタを にHostFunction正確に渡すことができることを意味しますが、これはデバイス メモリに直接アクセスできることを意味するものではありません。

c=AD[N-1];

2番目のポイントがあなたに言っているように。

できることは、ポインターを使用して、たとえば他の操作を実行したり、そのポインターを関数cudaMemcpyに渡したりすることです。__global__

したがって、可能HostFunction性は

__global__ void GPUFunction(int *AD)
{
    AD[threadIdx.x]= threadidx.x;
}

Hostfunction(int * AD)
{
    GPUFunction<<<...,...>>>(AD);
}
于 2013-10-04T15:40:44.637 に答える