Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cuda:固定内存零拷贝问题_C++_Memory_Cuda - Fatal编程技术网

C++ Cuda:固定内存零拷贝问题

C++ Cuda:固定内存零拷贝问题,c++,memory,cuda,C++,Memory,Cuda,我尝试了这个链接中的代码 问这个问题的人说这个项目对他来说很好 但在我身上却不一样 如果我在内核中操作这些值,它们不会改变 基本上我的问题是,我的GPU内存不够,但我想做需要更多内存的计算。我希望我的程序使用RAM内存或主机内存,并能够使用CUDA进行计算。链接中的程序似乎解决了我的问题,但代码并没有给出如图所示的输出 任何关于零拷贝内存的帮助或工作示例都将非常有用 多谢各位 __global__ void testPinnedMemory(double * mem) { double curr

我尝试了这个链接中的代码 问这个问题的人说这个项目对他来说很好 但在我身上却不一样 如果我在内核中操作这些值,它们不会改变

基本上我的问题是,我的GPU内存不够,但我想做需要更多内存的计算。我希望我的程序使用RAM内存或主机内存,并能够使用CUDA进行计算。链接中的程序似乎解决了我的问题,但代码并没有给出如图所示的输出

任何关于零拷贝内存的帮助或工作示例都将非常有用

多谢各位

__global__ void testPinnedMemory(double * mem)
{
double currentValue = mem[threadIdx.x];
printf("Thread id: %d, memory content: %f\n", threadIdx.x, currentValue);
mem[threadIdx.x] = currentValue+10;
}

void test() 
{
const size_t THREADS = 8;
double * pinnedHostPtr;
cudaHostAlloc((void **)&pinnedHostPtr, THREADS, cudaHostAllocDefault);

//set memory values
for (size_t i = 0; i < THREADS; ++i)
    pinnedHostPtr[i] = i;

//call kernel
dim3 threadsPerBlock(THREADS);
dim3 numBlocks(1);
testPinnedMemory<<< numBlocks, threadsPerBlock>>>(pinnedHostPtr);

//read output
printf("Data after kernel execution: ");
for (int i = 0; i < THREADS; ++i)
    printf("%f ", pinnedHostPtr[i]);    
printf("\n");
}
\uuuuu全局\uuuuuu无效testPinnedMemory(双*内存)
{
双电流值=mem[threadIdx.x];
printf(“线程id:%d,内存内容:%f\n”,threadIdx.x,currentValue);
mem[threadIdx.x]=当前值+10;
}
无效测试()
{
const size_t线程=8;
双*pinnedHostPtr;
cudaHostAlloc((void**)和pinnedHostPtr,螺纹,cudaHostAllocDefault);
//设置内存值
用于(尺寸i=0;i(pinnedHostPtr);
//读取输出
printf(“内核执行后的数据:”);
对于(int i=0;i
首先,要分配ZeroCopy内存,必须指定
cudaHostAllocMapped
标志作为
cudaHostAlloc
的参数

cudaHostAlloc((void **)&pinnedHostPtr, THREADS * sizeof(double), cudaHostAllocMapped);
不过,
pinnedHostPointer
将仅用于从主机端访问映射内存。要从设备访问同一内存,必须获得指向内存的设备端指针,如下所示:

double* dPtr;
cudaHostGetDevicePointer(&dPtr, pinnedHostPtr, 0);
#include <cstdio>

__global__ void testPinnedMemory(double * mem)
{
    double currentValue = mem[threadIdx.x];
    printf("Thread id: %d, memory content: %f\n", threadIdx.x, currentValue);
    mem[threadIdx.x] = currentValue+10;
}

int main() 
{
    const size_t THREADS = 8;
    double * pinnedHostPtr;
    cudaHostAlloc((void **)&pinnedHostPtr, THREADS * sizeof(double), cudaHostAllocMapped);

    //set memory values
    for (size_t i = 0; i < THREADS; ++i)
        pinnedHostPtr[i] = i;

    double* dPtr;
    cudaHostGetDevicePointer(&dPtr, pinnedHostPtr, 0);

    //call kernel
    dim3 threadsPerBlock(THREADS);
    dim3 numBlocks(1);
    testPinnedMemory<<< numBlocks, threadsPerBlock>>>(dPtr);
    cudaDeviceSynchronize();

    //read output
    printf("Data after kernel execution: ");
    for (int i = 0; i < THREADS; ++i)
        printf("%f ", pinnedHostPtr[i]);    
    printf("\n");

    return 0;
}
将此指针作为内核参数传递

testPinnedMemory<<< numBlocks, threadsPerBlock>>>(dPtr);

您没有分配足够的内存。当您需要
8*sizeof(double)
bytesno时,您当前正在分配8个字节,
size\t
不会这样做。使用固定零拷贝是否会利用RAM中的内存作为变量??如果它将变量复制到GPU中,那么在正常复制的malloc中实际上没有区别,不是吗?是的,主机RAM用于变量存储。我不确定它到底是如何工作的,可能是通过PCI express总线使用的。退房给出了何时使用零拷贝内存的想法。