将 thrust device_vectors 传递给设备函数并修改它们
Pass thrust device_vectors to device function and modify them
当我在 运行 这段代码时,编译器说我正在从全局函数调用宿主函数。
我想向 A[i] 和 B[i] 分配比零更复杂的东西,但我只是想测试功能。
我需要修改两个向量中的值。
稍后我想减少 table A.
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid, threadsPerBlock>>>(A, B, numElements);
}
__global__ void vectorCount(thrust::device_vector<double> A, thrust::device_vector<double> B, int numElements, int sequence_k){
int i = blockDim.x * blockIdx.x + threadIdx.x;
A[i] = 0;
B[i] = 0;
}
我试过改成
struct saxpy_functor
{
const int numElements;
saxpy_functor(int _a) : numElements(_a) {}
__host__ __device__
double operator()(double& x) const {
x = 0;
return 0;
}
};
//in main
thrust::transform(A.begin(), A.end(), B.begin(), saxpy_functor(numElements));
但是我找不到如何获得 i 就像前面的例子一样,因为我想根据 possition 执行计算在向量中?
尽管如此命名,thrust::device_vector
不能直接用于 CUDA 设备代码。 device_vector
是一个 object/container,它只能在主机代码中使用。这就是为什么您收到有关“调用主机函数...”的消息的原因。
对于您在此处显示的示例,要直接访问数据,您将(在主机代码中)提取指向每个容器(A
和 B
)中基础数据的设备指针,并且将这些指针传递给您的 CUDA 内核。
像这样:
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
double *d_A = thrust::raw_pointer_cast(A.data());
double *d_B = thrust::raw_pointer_cast(B.data());
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, numElements);
}
__global__ void vectorCount(double *A, double *B, int numElements){
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements){
A[i] = 0;
B[i] = 0;}
}
thrust::transform
/functor 方法的常规用法不允许随机访问基础数据。但是,如果您愿意,您可以使用像 this 这样的“非推力类”方法来使用仿函数方法并允许随机访问。
当我在 运行 这段代码时,编译器说我正在从全局函数调用宿主函数。 我想向 A[i] 和 B[i] 分配比零更复杂的东西,但我只是想测试功能。 我需要修改两个向量中的值。 稍后我想减少 table A.
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid, threadsPerBlock>>>(A, B, numElements);
}
__global__ void vectorCount(thrust::device_vector<double> A, thrust::device_vector<double> B, int numElements, int sequence_k){
int i = blockDim.x * blockIdx.x + threadIdx.x;
A[i] = 0;
B[i] = 0;
}
我试过改成
struct saxpy_functor
{
const int numElements;
saxpy_functor(int _a) : numElements(_a) {}
__host__ __device__
double operator()(double& x) const {
x = 0;
return 0;
}
};
//in main
thrust::transform(A.begin(), A.end(), B.begin(), saxpy_functor(numElements));
但是我找不到如何获得 i 就像前面的例子一样,因为我想根据 possition 执行计算在向量中?
尽管如此命名,thrust::device_vector
不能直接用于 CUDA 设备代码。 device_vector
是一个 object/container,它只能在主机代码中使用。这就是为什么您收到有关“调用主机函数...”的消息的原因。
对于您在此处显示的示例,要直接访问数据,您将(在主机代码中)提取指向每个容器(A
和 B
)中基础数据的设备指针,并且将这些指针传递给您的 CUDA 内核。
像这样:
int main(void){
const int numElements = 100000;
thrust::device_vector<double> A(numElements);
thrust::device_vector<double> B(numElements);
double *d_A = thrust::raw_pointer_cast(A.data());
double *d_B = thrust::raw_pointer_cast(B.data());
int threadsPerBlock = 256;
int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorCount<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, numElements);
}
__global__ void vectorCount(double *A, double *B, int numElements){
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements){
A[i] = 0;
B[i] = 0;}
}
thrust::transform
/functor 方法的常规用法不允许随机访问基础数据。但是,如果您愿意,您可以使用像 this 这样的“非推力类”方法来使用仿函数方法并允许随机访问。