1

私は少しCUDAの初心者なので、誰かが私を助けてくれるかどうか疑問に思っていました。

ピン留めはプログラムのパフォーマンスを大幅に向上させることができると読んだので、まさにそれを実行しようとしています。計算能力が1.0のGeForceGT330でコードを実行しています。

プログラムを実行すると、cudaMallocHostがメモリの割り当てに失敗したため、問題を以下に示す小さな例に要約しました。

Mesh.hpp

#ifndef MESH_HPP_

#define MESH_HPP_


#include <cstddef>
#include <vector>

#include <driver_types.h>

class Mesh{
public:
  Mesh();
  ~Mesh();  
  void pin_data();

  std::vector<size_t> _a;
  size_t* _a_pinned;

private:
  void cuda_check(cudaError_t success);
};

#endif /* MESH_HPP_ */

Mesh.cpp

#include <iostream>
#include <cmath>
#include <vector>
#include <string.h>

#include <cuda.h>
#include <cuda_runtime.h>

#include "Mesh.hpp"

Mesh::Mesh(){
  for(size_t i = 0; i < 10; i++){
    _a.push_back(i);
  }
}

Mesh::~Mesh() {
  cudaFreeHost(_a_pinned);
}

void Mesh::pin_data() {
  size_t _a_bytes = sizeof(size_t) * _a.size();

  cuda_check(cudaMallocHost((void **)_a_pinned, _a_bytes));
  memcpy(_a_pinned, &_a[0], _a_bytes);
}

void Mesh::cuda_check(cudaError_t status) {
  if (status != cudaSuccess) {
    std::cout << "Error could not allocate memory result " << status << std::endl;
    exit(1);
  }
}

Main.cpp

#include <cstdlib>
#include <iostream>

#include "Mesh.hpp"


int main(int argc, char **argv){

  Mesh *mesh = new Mesh();
  mesh->pin_data();

  delete mesh;

  return EXIT_SUCCESS;
}

コードを実行すると、出力は次のようになります。

「エラーはメモリ結果11を割り当てることができませんでした」

4

1 に答える 1

5

この行を変更します。

cuda_check(cudaMallocHost((void **)_a_pinned, _a_bytes));

これに:

cuda_check(cudaMallocHost((void **)&_a_pinned, _a_bytes));

(唯一の変更は、アンパサンドを追加することです)

cudaMalloc 操作はポインター値を変更することを想定しているため、ポインター自体ではなく、変更するポインターのアドレスを渡す必要があります。

それは私のためにそれを修正しました。私はまだベクトルに少し戸惑ってい<size_t>ますが、それぞれが独自のものです。

提案として、Mesh:cuda_checkメソッドに次のような行を追加することをお勧めします。

  std::cout << "Error could not allocate memory result " << status << std::endl;
  std::cout << "Error is: " << cudaGetErrorString(status) << std::endl; //add this line
于 2013-03-03T00:38:54.407 に答える