我正在考虑以下简单代码,其中我将thrust::host_vector<int>::iterator h_temp_iterator = h_temp.begin();和转换thrust::device_vector<int>::iterator d_temp_iterator = d_temp.begin();为原始指针。
为此,我分别将&(h_temp_iterator[0])和传递&(d_temp_iterator[0])给函数和内核。前者(CPU 情况)可以编译,后者(GPU 情况)则不能。这两种情况原则上应该是对称的,所以我不明白错误消息的原因是:
Error 1 error : no suitable conversion function from "thrust::device_ptr<int>" to "int *" exists
Run Code Online (Sandbox Code Playgroud)
配置是:
Windows 7, Visual Studio 2010, CUDA 7.5, 编译架构3.5。Windows 10, Visual Studio 2013, CUDA 8.0, 编译架构5.2。代码
#include <thrust\host_vector.h>
#include <thrust\device_vector.h>
__global__ void testKernel(int *a, const int N)
{
int i = threadIdx.x;
if (i >= N) return;
a[i] = 2;
}
void testFunction(int *a, const int N)
{
for (int i = 0; i < N; i++) a[i] = 2;
}
int main()
{
const int N = 10;
thrust::host_vector<int> h_temp(N);
thrust::device_vector<int> d_temp(N);
thrust::host_vector<int>::iterator h_temp_iterator = h_temp.begin();
thrust::device_vector<int>::iterator d_temp_iterator = d_temp.begin();
testFunction(&(h_temp_iterator[0]), N);
testKernel<<<1, N>>>(&(d_temp_iterator[0]), N);
for (int i = 0; i < N; i++) printf("%i %i\n", i, h_temp[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据talonmies的评论,解决方案是通过
thrust::raw_pointer_cast(&d_temp_iterator[0])
Run Code Online (Sandbox Code Playgroud)
并不是
&d_temp_iterator[0]
Run Code Online (Sandbox Code Playgroud)
下面是完整的工作代码
#include <thrust\host_vector.h>
#include <thrust\device_vector.h>
__global__ void testKernel(int *a, const int N)
{
int i = threadIdx.x;
if (i >= N) return;
a[i] = 2;
printf("GPU %i %i\n", i, a[i]);
}
void testFunction(int *a, const int N)
{
for (int i = 0; i < N; i++) {
a[i] = 2;
printf("CPU %i %i\n", i, a[i]);
}
}
int main()
{
const int N = 10;
thrust::host_vector<int> h_temp(N);
thrust::device_vector<int> d_temp(N);
thrust::host_vector<int>::iterator h_temp_iterator = h_temp.begin();
thrust::device_vector<int>::iterator d_temp_iterator = d_temp.begin();
int *temp = thrust::raw_pointer_cast(&d_temp_iterator[0]);
testFunction(&(h_temp_iterator[0]), N);
testKernel<<<1, N>>>(temp, N);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1759 次 |
| 最近记录: |