Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
cudaMemset是否应该在从cudaHostRegister映射的设备指针上工作_Cuda_Mapped Memory - Fatal编程技术网

cudaMemset是否应该在从cudaHostRegister映射的设备指针上工作

cudaMemset是否应该在从cudaHostRegister映射的设备指针上工作,cuda,mapped-memory,Cuda,Mapped Memory,我从我的一位同事那里看到了示例代码,在V100上运行时,cudaMemset似乎无法正常工作 #include <iostream> #include <stdio.h> #define CUDACHECK(cmd) \ {\ cudaError_t error = cmd;\ if (error != cudaSuccess) { \ fprintf(stderr, "info: '%s'(%d) at %s:%d\n&quo

我从我的一位同事那里看到了示例代码,在V100上运行时,cudaMemset似乎无法正常工作

#include <iostream>
#include <stdio.h>
#define CUDACHECK(cmd) \
{\
    cudaError_t error  = cmd;\
    if (error != cudaSuccess) { \
        fprintf(stderr, "info: '%s'(%d) at %s:%d\n", cudaGetErrorString(error), error,__FILE__, __LINE__);\
          }\
}

__global__ void setValue(int value, int* A_d) {
     int tx = threadIdx.x + blockIdx.x * blockDim.x;
     if(tx == 0){
         A_d[tx] =  A_d[tx] + value;
     }
}

__global__ void printValue(int* A_d) {
     int tx = threadIdx.x + blockIdx.x * blockDim.x;
     if(tx == 0){
         printf("A_d: %d\n", A_d[tx]);
     }
}

int main(int argc, char* argv[ ]){
        int *A_h, *A_d;
        int size = sizeof(int);
        A_h = (int*)malloc(size);
        A_h[0] = 1;
        CUDACHECK(cudaSetDevice(0));
        CUDACHECK(cudaHostRegister(A_h, size, 0));
        CUDACHECK(cudaHostGetDevicePointer((void**)&A_d, A_h, 0));
        setValue<<<64,1,0,0>>>(5, A_d);
        cudaDeviceSynchronize();
        printf("A_h: %d\n", A_h[0]);
        A_h[0] = 100;
        printf("A_h: %d\n",A_h[0]);
        printValue<<<64,1,0,0>>>(A_d);
        cudaDeviceSynchronize();
        CUDACHECK (cudaMemset(A_d, 1, size) );
        printf("A_h: %d\n",A_h[0]);
        printValue<<<64,1,0,0>>>(A_d);
        cudaDeviceSynchronize();
        cudaHostUnregister(A_h);
        free(A_h);
}
我们希望使用cudaMemset将A_h和A_d设置为1。但正如所见,它被设定为一些巨大的价值。 那么,cudaMemset是否需要在cudaHostGetDevicePointer返回的设备指针A_d上工作。 这是一种仅用于内核的方法吗。 我们还看到cudaMemcpy DtoH或HtoD似乎在同一个设备指针A_d上工作。 有人能帮我们做正确的行为吗

我们希望使用cudaMemset将A_h和A_d设置为1

您对
cudaMemset
的工作原理感到困惑。从概念上讲,它非常类似于C标准库中的
memset
。您应该使用
memset
尝试相同的测试用例,看看它能做什么

无论如何,
cudaMemset
需要设置指针、字节值和字节大小,就像
memset
一样

因此,您的
cudaMemset
命令:

    CUDACHECK (cudaMemset(A_d, 1, size) );
正在将每个字节设置为1。由于
size
是4,这意味着您正在将
A_d[0]
设置为
0x01010101
(十六进制)。如果将该值插入windows程序员计算器,则该值为16843009(十进制)。因此,从我所看到的情况来看,一切都在按预期进行

同样,我非常肯定,对于相同的测试用例/用法,您会看到
memset
的相同行为

我们希望使用cudaMemset将A_h和A_d设置为1

您对
cudaMemset
的工作原理感到困惑。从概念上讲,它非常类似于C标准库中的
memset
。您应该使用
memset
尝试相同的测试用例,看看它能做什么

无论如何,
cudaMemset
需要设置指针、字节值和字节大小,就像
memset
一样

因此,您的
cudaMemset
命令:

    CUDACHECK (cudaMemset(A_d, 1, size) );
正在将每个字节设置为1。由于
size
是4,这意味着您正在将
A_d[0]
设置为
0x01010101
(十六进制)。如果将该值插入windows程序员计算器,则该值为16843009(十进制)。因此,从我所看到的情况来看,一切都在按预期进行


同样,我非常肯定,对于相同的测试用例/用法,您会看到
memset的相同行为。

My bad。谢谢你的澄清。这意味着这里A_d的值可以通过改变A_h或使用cudaMemcpy来修改,如果我是对的。如果我们想将A_d设置为0,可以使用cudaMemset。是的,
cudaMemset
可以用于将整数和浮点量设置为零。如果试图将这些类型设置为其他值,那么它就没那么有用了。谢谢你的澄清。这意味着这里A_d的值可以通过改变A_h或使用cudaMemcpy来修改,如果我是对的。如果我们想将A_d设置为0,可以使用cudaMemset。是的,
cudaMemset
可以用于将整数和浮点量设置为零。如果试图将这些类型设置为其他值,则不太有用。