Cuda 通过推力从全局访问指针
我们如何通过推力从全局访问指针Cuda 通过推力从全局访问指针,cuda,nvidia,thrust,Cuda,Nvidia,Thrust,我们如何通过推力从全局访问指针 thrust::device_vector<int> testvec; int *send_data = thrust::raw_pointer_cast(&testvec[0]); << <1, 1 >> > (send_data, raw_ptr ); 推力::设备向量测试向量; int*send\u data=推力::原始指针\u转换(&testvec[0]); >(发送数据、原始ptr);
thrust::device_vector<int> testvec;
int *send_data = thrust::raw_pointer_cast(&testvec[0]);
<< <1, 1 >> > (send_data, raw_ptr );
推力::设备向量测试向量;
int*send\u data=推力::原始指针\u转换(&testvec[0]);
>(发送数据、原始ptr);
我能够在全局中使用send_数据
与……合作。我找不到它
thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(raw_ptr);
printf("addr: %p\n", dev_ptr); <<< i am able to retrieve pointer address but not data
推力::设备\u ptr dev\u ptr=推力::设备\u指针\u cast(原始\u ptr);
printf(“地址:%p\n”,dev_ptr) 有许多方法可以从主机访问设备数据。你可以:
隐式复制它(在下面的代码中演示)
使用推力::复制将其复制回
将其复制回来cudaMemcpy
您还可以直接在主机代码中获取设备向量元素,推力将在引擎盖下为您进行必要的复制,然后将它们打印出来
以下代码演示了这四种方法-我相信还有其他方法或变体:
$ cat t897.cu
#include <thrust/device_vector.h>
#include <thrust/copy.h>
#define DSIZE 10
__global__ void kernel(int *send_data, int sz){
int idx = threadIdx.x+blockDim.x*blockIdx.x;
if (idx < sz) send_data[idx]++;
}
int main(){
thrust::device_vector<int> testvec(DSIZE);
int *send_data = thrust::raw_pointer_cast(&(testvec[0]));
kernel<<<1,DSIZE>>>(send_data, DSIZE);
// method 1
thrust::host_vector<int> hvec1 = testvec;
for (int i = 0; i < DSIZE; i++) printf("%d: %d\n", i, hvec1[i]);
// method 2
thrust::host_vector<int> hvec2(DSIZE);
thrust::copy(testvec.begin(), testvec.end(), hvec2.begin());
for (int i = 0; i < DSIZE; i++) printf("%d: %d\n", i, hvec2[i]);
// method 3
int *hvec3 = (int *)malloc(DSIZE*sizeof(int));
cudaMemcpy(hvec3, send_data, DSIZE*sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < DSIZE; i++) printf("%d: %d\n", i, hvec3[i]);
// method 4
for (int i = 0; i < DSIZE; i++) { int temp = testvec[i]; printf("%d: %d\n", i, temp);}
}
$ nvcc -o t897 t897.cu
$ ./t897
0: 1
1: 1
2: 1
3: 1
4: 1
5: 1
6: 1
7: 1
8: 1
9: 1
0: 1
1: 1
2: 1
3: 1
4: 1
5: 1
6: 1
7: 1
8: 1
9: 1
0: 1
1: 1
2: 1
3: 1
4: 1
5: 1
6: 1
7: 1
8: 1
9: 1
0: 1
1: 1
2: 1
3: 1
4: 1
5: 1
6: 1
7: 1
8: 1
9: 1
$
$cat t897.cu
#包括
#包括
#定义DSIZE 10
__全局无效内核(int*发送数据,int sz){
int idx=threadIdx.x+blockDim.x*blockIdx.x;
如果(idx
您需要发布一个