私はCUDAを初めて使用し、使用したいと思いますcudaHostAlloc
。私は自分の問題をこの次のコードに切り分けることができました。malloc
ホストの割り当てに使用するとcudaHostAlloc
、割り当てられた領域が無効である可能性があるため、セグメンテーションフォールトが発生しますか?どちらの場合もポインタをダンプするとnullではないので、cudaHostAlloc
何かを返します...
作品
in_h = (int*) malloc(length*sizeof(int)); //works
for (int i = 0;i<length;i++)
in_h[i]=2;
動作しません
cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
for (int i = 0;i<length;i++)
in_h[i]=2; //segfaults
スタンドアロンコード
#include <stdio.h>
void checkDevice()
{
cudaDeviceProp info;
int deviceName;
cudaGetDevice(&deviceName);
cudaGetDeviceProperties(&info,deviceName);
if (!info.deviceOverlap)
{
printf("Compute device can't use streams and should be discarded.");
exit(EXIT_FAILURE);
}
}
int main()
{
checkDevice();
int *in_h;
const int length = 10000;
cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
printf("segfault comming %d\n",in_h);
for (int i = 0;i<length;i++)
{
in_h[i]=2; // Segfaults here
}
return EXIT_SUCCESS;
}
〜
呼び出し
[id129]$ nvcc fun.cu
[id129]$ ./a.out
segfault comming 327641824
Segmentation fault (core dumped)
詳細
プログラムは、クラスター上でインタラクティブモードで実行されます。計算ノードからプログラムを呼び出すと、プログラムがクラスターにプッシュされると言われました。他の自家製のおもちゃのcudaコードに問題はありませんでした。
編集
cudaError_t err = cudaHostAlloc((void**)&in_h,length*sizeof(int),cudaHostAllocDefault);
printf("Error status is %s\n",cudaGetErrorString(err));
ドライバーエラーが発生します...
Error status is CUDA driver version is insufficient for CUDA runtime version