Cuda 如何更改推力::设备\向量的设备id

Cuda 如何更改推力::设备\向量的设备id,cuda,thrust,Cuda,Thrust,是否可以更改推力::设备向量的设备id? 我正在考虑这样编写代码 cudaSetDevice(0); //set to device:0 thrust::device_vector<int> a(10); //define the device vector a.clear(); thrust::device_vector<int>().swap(a); //deallocate

是否可以更改推力::设备向量的设备id? 我正在考虑这样编写代码

cudaSetDevice(0);                                //set to device:0
thrust::device_vector<int> a(10);                //define the device vector
a.clear(); thrust::device_vector<int>().swap(a); //deallocate the vector

cudaSetDevice(1);                                //set to device:1
a.resize(10);
cudaSetDevice(0)//设置为设备:0
推力:装置_矢量a(10)//定义设备向量
a、 清除();推力::设备_向量().交换(a)//取消分配向量
cudaSetDevice(1)//设置为设备:1
a、 调整大小(10);
可能吗?
谢谢

我不知道它是否以及如何与推力一起工作,以及您是否试图更改不使用推力的设备阵列的设备id,以及您是否知道对等内存访问

这是一个有趣的问题,但我可以自己做实验。 但是,根据CUDA编程指南(第3.2.6.4节),如果您使用计算能力2.x和更高版本的特斯拉卡,则可以进行点对点内存访问(即两个设备可以相互寻址)

这是《编程指南》中的一个示例:

cudaSetDevice(0);
float* p0;
size_t size = 1024 * sizeof(float);
cudaMalloc(&p0, size);
MyKernel<<<1000, 128>>>(p0);
cudaSetDevice(1);
cudaDeviceEnablePeerAccess(0, 0);  // <- this enables peer to peer access
MyKernel<<<1000,128>>>(p0);
cudaSetDevice(0);
浮点*p0;
大小\u t size=1024*sizeof(浮动);
Cudamaloc(&p0,大小);
MyKernel(p0);
cudaSetDevice(1);

cudaDeviceEnablePeerAccess(0,0);// 我不知道它是否和如何准确地与推力一起工作,以及您是否试图更改不使用推力的设备阵列的设备id,以及您是否知道对等内存访问

这是一个有趣的问题,但我可以自己做实验。 但是,根据CUDA编程指南(第3.2.6.4节),如果您使用计算能力2.x和更高版本的特斯拉卡,则可以进行点对点内存访问(即两个设备可以相互寻址)

这是《编程指南》中的一个示例:

cudaSetDevice(0);
float* p0;
size_t size = 1024 * sizeof(float);
cudaMalloc(&p0, size);
MyKernel<<<1000, 128>>>(p0);
cudaSetDevice(1);
cudaDeviceEnablePeerAccess(0, 0);  // <- this enables peer to peer access
MyKernel<<<1000,128>>>(p0);
cudaSetDevice(0);
浮点*p0;
大小\u t size=1024*sizeof(浮动);
Cudamaloc(&p0,大小);
MyKernel(p0);
cudaSetDevice(1);

cudaDeviceEnablePeerAccess(0,0);// 我不知道这是否是一个正确的答案。如果我错了,请纠正我,因为我不知道测试是否足够正确。所以我决定对向量加法做如下测试

#include <thrust/device_vector.h>
#include <iostream>

__global__ void
vectorAdd(const int *A, const int *B, int *C, int numElements) {
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < numElements) C[i] = A[i] + B[i];
};

int main(void)
{
    int numElements = 1024;
    int randacc = 30;

    cudaSetDevice(0);
    thrust::device_vector<int> a(numElements, 1);
    thrust::device_vector<int> b(numElements, 2);
    thrust::device_vector<int> c(numElements);

    int* a_d = thrust::raw_pointer_cast(&a[0]);
    int* b_d = thrust::raw_pointer_cast(&b[0]);
    int* c_d = thrust::raw_pointer_cast(&c[0]);

    int threadsPerBlock = 64;
    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;

    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d, numElements);
    cudaError_t err = cudaGetLastError();

    if (err != cudaSuccess) std::cerr << cudaGetErrorString(err) << std::endl;
    std::cout << "random access on dev 0, c = " << c[randacc] << std::endl;

    a.clear(); thrust::device_vector<int>().swap(a); //deallocate the vector
    b.clear(); thrust::device_vector<int>().swap(b); //deallocate the vector
    c.clear(); thrust::device_vector<int>().swap(c); //deallocate the vector

    cudaSetDevice(1);                                //set to device:1
    a.resize(numElements, 1);
    b.resize(numElements, 2);
    c.resize(numElements);

    a_d = thrust::raw_pointer_cast(&a[0]);
    b_d = thrust::raw_pointer_cast(&b[0]);
    c_d = thrust::raw_pointer_cast(&c[0]);

    threadsPerBlock = 64;
    blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;

    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d, numElements);
    err = cudaGetLastError();

    if (err != cudaSuccess) std::cerr << cudaGetErrorString(err) << std::endl;
    std::cout << "random access on dev 1, c = " << c[randacc] << std::endl;

    return 0;
}
#包括
#包括
__全局无效
矢量添加(常量int*A、常量int*B、int*C、整数){
int i=blockDim.x*blockIdx.x+threadIdx.x;
如果(i如果(err!=cudaSuccess)std::cerr我不知道这是否是一个正确的答案。因此,如果我错了,请纠正我,因为我不知道测试是否足够正确。因此,我决定对向量加法进行测试,如下所示

#include <thrust/device_vector.h>
#include <iostream>

__global__ void
vectorAdd(const int *A, const int *B, int *C, int numElements) {
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < numElements) C[i] = A[i] + B[i];
};

int main(void)
{
    int numElements = 1024;
    int randacc = 30;

    cudaSetDevice(0);
    thrust::device_vector<int> a(numElements, 1);
    thrust::device_vector<int> b(numElements, 2);
    thrust::device_vector<int> c(numElements);

    int* a_d = thrust::raw_pointer_cast(&a[0]);
    int* b_d = thrust::raw_pointer_cast(&b[0]);
    int* c_d = thrust::raw_pointer_cast(&c[0]);

    int threadsPerBlock = 64;
    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;

    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d, numElements);
    cudaError_t err = cudaGetLastError();

    if (err != cudaSuccess) std::cerr << cudaGetErrorString(err) << std::endl;
    std::cout << "random access on dev 0, c = " << c[randacc] << std::endl;

    a.clear(); thrust::device_vector<int>().swap(a); //deallocate the vector
    b.clear(); thrust::device_vector<int>().swap(b); //deallocate the vector
    c.clear(); thrust::device_vector<int>().swap(c); //deallocate the vector

    cudaSetDevice(1);                                //set to device:1
    a.resize(numElements, 1);
    b.resize(numElements, 2);
    c.resize(numElements);

    a_d = thrust::raw_pointer_cast(&a[0]);
    b_d = thrust::raw_pointer_cast(&b[0]);
    c_d = thrust::raw_pointer_cast(&c[0]);

    threadsPerBlock = 64;
    blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;

    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(a_d, b_d, c_d, numElements);
    err = cudaGetLastError();

    if (err != cudaSuccess) std::cerr << cudaGetErrorString(err) << std::endl;
    std::cout << "random access on dev 1, c = " << c[randacc] << std::endl;

    return 0;
}
#包括
#包括
__全局无效
矢量添加(常量int*A、常量int*B、int*C、整数){
int i=blockDim.x*blockIdx.x+threadIdx.x;
如果(i如果代码段中有(err!=cudaSuccess)std::cerr,则释放
a
(请参阅),然后在设备
1
?@PhillipD上调整其大小,但它没有说明如何更改向量的设备container@JackOLantern是的,我通过执行推力::设备_向量()来释放内存。交换(a);在您的代码片段中,您正在释放
a
(请参阅),然后在设备
1
?上调整它的大小@PhillipD它没有告诉您如何更改向量的设备container@JackOLantern是的,我通过执行推力::设备_向量()来释放内存。交换(a);最后一句话足够回答这个问题。@PhillipD,尽管它与点对点相关,但我的问题不是关于点对点的,因为我想做的是模仿这个过程:在设备0上设置内存,释放内存,使用相同的指针在设备1上设置内存。但是,我想使用普通的Cudamaloc,而不是使用普通的Cudamaloc推力::设备\向量最后一句话就足以回答这个问题。@PhillipD,尽管它与点对点相关,但我的问题不是关于点对点,因为我想做的是模仿这个过程:在设备0上设置内存,释放内存,用同一个指针在设备1上设置内存。但是,使用普通的Cudamaloc,我想要使用推力::设备\向量来实现吗