2016-06-27 5 views
0

Когда я использую thrust :: device_vector в основной функции, я могу правильно передать его функции ядра, код следующим образом :как сделать двухмерную тягу :: device_vector <thrust :: device_vector <int>> к необработанному указателю

thrust::device_vector<int> device_a(2); 
thrust::host_vector<int> host_a(2); 
MyTest << <1, 2 >> >(thrust::raw_pointer_cast(&device_a[0]),device_a.size()); 
host_a = device_a; 
for (int i = 0; i < host_a.size();i++) 
cout << host_a[i] << endl; 

, но я хочу использовать 2-мерный device_vector в своем коде, как его использовать? как показано на рисунке I следующий код

__global__ void MyTest(thrust::device_vector<int>* a,int total){ 
    int idx = threadIdx.x; 
    if (idx < total){ 
     int temp = idx; 
     a[idx][0] = temp; 
     a[idx][1] = temp; 
     __syncthreads(); 
     } 

} 
void main(){ 
    thrust::device_vector<thrust::device_vector<int>> device_a(2,thrust::device_vector<int>(2)); 

    thrust::host_vector<thrust::host_vector<int>> host_a(2,thrust::host_vector<int>(2)); 

    MyTest << <1, 2 >> >(thrust::raw_pointer_cast(device_a.data()),device_a.size()); 
    host_a = device_a; 
    for (int i = 0; i < host_a.size(); i++){ 
    cout << host_a[i][0] << endl; 
    cout << host_a[i][1] << endl; 
} 
} 

ответ

1

Как правило, контейнеры Регулировочные только хост-типа, которые не могут быть использованы в __device__ и __global__ функций.

Обычный способ использования 2-мерного массива состоит в том, чтобы поместить его в одномерное линейное пространство памяти, такое как следующий код.

__global__ void MyTest(int* a, int nrows, int ncols) { 
    int j = threadIdx.x; 
    int i = threadIdx.y; 
    if (i < nrows && j < ncols) { 
    int temp = i + j; 
    a[i * ncols + j] = temp; 
    } 

} 

int main(int argc, char** argv) { 
    int nrows = 2; 
    int ncols = 2; 
    thrust::device_vector<int> device_a(nrows * ncols); 
    MyTest<<<1, dim3(2, 2)>>>(thrust::raw_pointer_cast(device_a.data()), rows, ncols); 
    return 0; 
} 
+0

Спасибо за ваш ответ, это выглядит как если я хочу использовать 3-D или 4-D массива, я хав для преобразования этих массивов в 1-D линейного массива, а затем передать его в ядре функции. – Qiong