2013-02-15 27 views
6

Trong CUDA là có cách nào để biết nếu con trỏ trỏ trong bộ nhớ trên thiết bị hoặc máy chủ.Detection nếu một con trỏ trỏ theo thiết bị hoặc máy chủ trong CUDA

A làm ví dụ op điều này có thể là:

int *dev_c, *host_c; 
cudaMalloc((void**)&dev_c, sizeof(int)); 
host_c = (int*) malloc(sizeof(int)); 

tôi có thể đương nhiên nhìn vào cái tên, nhưng có cách nào để tìm kiếm quảng cáo các dev_c con trỏ và host_c và nói rằng, điểm host_c quảng cáo dẫn chương trình và dev_c points quảng cáo thiết bị.

+2

Thật không may, không có cách nào bạn có thể biết liệu con trỏ có được cấp phát trên máy chủ hoặc trên thiết bị hay không. – sgarizvi

Trả lời

0

Tôi không nghĩ rằng nó có thể. Con trỏ trỏ một số địa chỉ trong bộ nhớ và bạn không phải bây giờ nếu đây là máy chủ hoặc bộ nhớ thiết bị. Khi chương trình bắt đầu, nó có thể được đặt trong (gần như) mọi địa chỉ trong bộ nhớ của hệ điều hành, do đó bạn không thể thử đoán. Bạn nên lưu ý các tên biến.

3

Không trực tiếp. Một cách tiếp cận sẽ là viết một lớp đóng gói cho các con trỏ thiết bị sao cho nó hoàn toàn rõ ràng rằng các con trỏ thiết bị và máy chủ lưu trữ khác nhau trong mã của bạn. Bạn có thể xem mô hình của ý tưởng này trong thư viện mẫu Thrust, có loại được gọi là device_ptr để phân định rõ ràng loại thiết bị và kiểu con trỏ lưu trữ.

5

Bắt đầu (tôi nghĩ) 4 và CUDA Fermi GPU. Nvidia hỗ trợ UVA (Unified Virtual Address Space). Chức năng cudaPointerGetAttributes dường như thực hiện chính xác những gì bạn đang yêu cầu. Lưu ý rằng tôi tin rằng nó chỉ hoạt động cho con trỏ lưu trữ được phân bổ với cudaHostAlloc (và không phải c malloc).

2

Đây là một ví dụ nhỏ cho thấy cách Unified Virtual Addressing có thể được sử dụng để phát hiện nếu một con trỏ trỏ để lưu trữ hoặc không gian bộ nhớ điện thoại. Như @PrzemyslawZych đã chỉ ra, nó chỉ hoạt động đối với con trỏ lưu trữ được phân bổ với cudaMallocHost.

#include<stdio.h> 

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

#include<assert.h> 
#include<conio.h> 

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } 
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true) 
{ 
    if (code != cudaSuccess) 
    { 
     fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); 
     getch(); 
     if (abort) { exit(code); getch(); } 
    } 
} 

int main() { 

    int* d_data; 
    int* data; // = (int*)malloc(16*sizeof(int)); 
    cudaMallocHost((void **)&data,16*sizeof(int)); 

    gpuErrchk(cudaMalloc((void**)&d_data,16*sizeof(int))); 

    cudaDeviceProp prop; 
    gpuErrchk(cudaGetDeviceProperties(&prop,0)); 

    printf("Unified Virtual Addressing %i\n",prop.unifiedAddressing); 

    cudaPointerAttributes attributes; 
    gpuErrchk(cudaPointerGetAttributes (&attributes,d_data)); 
    printf("Memory type for d_data %i\n",attributes.memoryType); 
    gpuErrchk(cudaPointerGetAttributes (&attributes,data)); 
    printf("Memory type for data %i\n",attributes.memoryType); 

    getch(); 

    return 0; 
} 
Các vấn đề liên quan