CUDAプログラミングガイドには、「経由で割り当てられたメモリmalloc()
はランタイムを使用して(つまり、デバイスメモリから任意のコピーメモリ関数を呼び出すことで)コピーできる」と記載されていますが、どういうわけかこの機能を再現するのに問題があります。コード:
#include <cstdio>
__device__ int* p;
__global__ void allocate_p() {
p = (int*) malloc(10);
printf("p = %p (seen by GPU)\n", p);
}
int main() {
cudaError_t err;
int* localp = (int*) malloc(10);
allocate_p<<<1,1>>>();
cudaDeviceSynchronize();
//Getting pointer to device-allocated memory
int* tmpp = NULL;
cudaMemcpyFromSymbol(&tmpp, p, 4);
printf("p = %p (seen by CPU)\n", tmpp);
//cudaMalloc((void**)&tmpp, 40);
err = cudaMemcpy(tmpp, localp, 40, cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
printf(" err:%i %s", (int)err, cudaGetErrorString(err));
delete localp;
return 0;
}
出力でクラッシュします:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
私は、ホストがデバイス上の適切なアドレスを認識しているが、どういうわけかそれがから来るのを好まないことを収集しますmalloc()
。
以前に割り当ててから、 (ではなく)に割り当てられるカーネルへの引数としてcudaMalloc((void**)&np, 40);
ポインタを渡すと、コードは正常に実行されます。np
allocate_p
p
malloc()
何が間違っていますか/malloc()
ホスト側の機能で割り当てられたデバイスメモリをどのように使用しますか?