1

を使用して、ホストにページ整列メモリを割り当てましたposix_memalign。への呼び出しposix_memalignはエラーを返しません。ただし、このポインターを引数として使用するcudaHostRegisterと、「無効な引数」エラーが発生します。問題は何ですか?

  • CUDA API バージョン: 4.0
  • gcc バージョン: 4.4.5
  • GPU 計算能力: 2.0

メモリ割り当てはアプリケーション コードで行われ、ポインタがライブラリ ルーチンに渡されます。

アプリケーション コード スニペット:

if(posix_memalign((void **)&h_A, getpagesize(), n * n * sizeof(float))) {
  printf("Error allocating aligned memory for A\n");
  return 1;
}

共有ライブラリのコード スニペット:

if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
  fprintf(stderr, "Error setting device flag: %s\n", 
          cudaGetErrorString(ret));
  return NULL;
}

if((ret = cudaHostRegister(h_A, n2 * sizeof(float), 
                          cudaHostRegisterMapped)) != cudaSuccess) {
  fprintf(stderr, "Error registering page-locked memory for A: %s\n", 
          cudaGetErrorString(ret));
  return NULL;
}
4

1 に答える 1

3

これを再現できません。あなたが提供したコードスニペットを取り、それらを最小限の実行可能ファイルにすると:

#include <unistd.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>

int main(void)
{
    const int n2 = 100 * 100;
    float *h_A;
    cudaError_t ret;

    if(posix_memalign((void **)&h_A, getpagesize(), n2 * sizeof(float))) {
        printf("Error allocating aligned memory for A\n");
        return -1;
    }


    if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
        fprintf(stderr, "Error setting device flag: %s\n", 
                cudaGetErrorString(ret));
        return -1;
    }

    if((ret = cudaHostRegister(h_A, n2 * sizeof(float), 
                    cudaHostRegisterMapped)) != cudaSuccess) {
        fprintf(stderr, "Error registering page-locked memory for A: %s\n", 
                cudaGetErrorString(ret));
        return -1;
    }

    return 0;
}

304.54 ドライバーを使用する 64 ビット Linux ホスト上の CUDA 4.2 と CUDA 5.0 の両方でエラーなしでコンパイルおよび実行されます。したがって、CUDAのインストールが壊れているか、コードに表示されていない場所に問題があると結論付けます。

おそらく、私が投稿したとおりにこのコードをコンパイルして実行し、何が起こるかを確認してください。それが機能する場合、ここで何がうまくいかないのかを絞り込むのに役立つかもしれません.

于 2013-03-25T10:21:54.780 に答える