2013-03-02 88 views
1

我是CUDA新手的一員,所以想知道是否有人可以幫我解決問題。cudaMallocHost無法分配最小的內存

我讀到固定可以嚴重提高你的程序性能,所以我試圖做到這一點。我在一臺具有1.0計算能力的GeForce GT 330上運行我的代碼。

當我運行我的程序時,得到的是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'

回答

5

變化這一行:

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

這樣:

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

(唯一的變化是添加符號)

cudaMalloc操作想到修改的指針值,因此它們must be passed the address of the pointer to modify ,而不是指針本身。

已經爲我修好了。我仍然對<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 
+0

是修復它謝謝!我最初使用的是size_t向量的代碼,所以沒有改變它。 – 2013-03-03 08:18:49