1

私は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
4

2 に答える 2

3

常にエラーをチェックしてください。cudaHostAllocメモリの割り当てに失敗している可能性があります。失敗した場合は、ベイリングではなく、未割り当てのアドレス空間に書き込んでいます。使用mallocする場合、要求に応じてメモリを割り当て、失敗しません。ただし、mallocでも失敗する場合があるため、ポインタに書き込む前にポインタをチェックすることをお勧めします。

将来的には、このようなことをするのが最善かもしれません

int *ptr = NULL;
// Allocate using cudaHostAlloc or malloc
// If using cudaHostAlloc check for success 
if (!ptr) ERROR_OUT();
// Write to this memory

EDIT(質問で編集するための応答)

エラーメッセージは、ツールキットと比較して古いドライバを使用していることを示しています。しばらく立ち往生したくない場合は、ドライバーと互換性のある古いバージョンのcudaツールキットをダウンロードしてみてください。これをユーザーアカウントにインストールして、そのnvcc+ライブラリを一時的に使用できます。

于 2012-11-27T23:21:13.497 に答える
0

セグメンテーション違反は、cudaHostAllocによって割り当てられたメモリブロックへの書き込みではなく、cudaHostAllocから返されたアドレスを「解放」しようとしたことが原因です。ご提供いただいたコードを使用して問題を再現することはできましたが、freeをcudaFreeHostに置き換えると、セグメンテーション違反が修正されました。

cudaFreeHost

于 2012-11-27T23:02:45.510 に答える