首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可能CUDA的memcpy(dst,src,0)写入*dst?

是否可能CUDA的memcpy(dst,src,0)写入*dst?
EN

Stack Overflow用户
提问于 2016-06-13 13:02:38
回答 1查看 213关注 0票数 3

我有一些名为memcpy(my_dst, my_src, my_num_bytes)的内核代码,有时my_num_bytes等于0。奇怪的是,一些零星的实验(使用泰坦X,CUDA 7.5,driver 358.16)表明,当我使用这样的电话时,数据确实会被写入目的地。

  1. 你在CUDA遇到过这种行为吗?
  2. 这里有指定的地方吗?memcpy() 没说的编程指南条目。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 14:40:05

这似乎是设备端memcpy() (当前,即数据自动化系统7.5)实现中的一个缺陷。

像这样的内核:

代码语言:javascript
复制
__global__ void kernel(char* source, char* dst, int len, int sz)
{

    int i = threadIdx.x * len;

    memcpy(source+i, dst+i, sz);
}

引导工具链像这样发出PTX:

代码语言:javascript
复制
        // .globl       _Z6kernelPcS_ii
.visible .entry _Z6kernelPcS_ii(
        .param .u64 _Z6kernelPcS_ii_param_0,
        .param .u64 _Z6kernelPcS_ii_param_1,
        .param .u32 _Z6kernelPcS_ii_param_2,
        .param .u32 _Z6kernelPcS_ii_param_3
)
{
        .reg .pred      %p<2>;
        .reg .b16       %rs<2>;
        .reg .b32       %r<4>;
        .reg .b64       %rd<15>;


        ld.param.u64    %rd7, [_Z6kernelPcS_ii_param_0];
        ld.param.u64    %rd8, [_Z6kernelPcS_ii_param_1];
        ld.param.u32    %r1, [_Z6kernelPcS_ii_param_2];
        cvta.to.global.u64      %rd9, %rd8;
        cvta.to.global.u64      %rd10, %rd7;
        mov.u32         %r2, %tid.x;
        mul.lo.s32      %r3, %r2, %r1;
        cvt.s64.s32     %rd11, %r3;
        add.s64         %rd1, %rd10, %rd11;
        add.s64         %rd2, %rd9, %rd11;
        mov.u64         %rd14, 0;
        ld.param.s32    %rd3, [_Z6kernelPcS_ii_param_3];

BB6_1:
        add.s64         %rd12, %rd2, %rd14;
        ld.global.u8    %rs1, [%rd12];
        add.s64         %rd13, %rd1, %rd14;
        st.global.u8    [%rd13], %rs1;
        add.s64         %rd14, %rd14, 1;
        setp.lt.u64     %p1, %rd14, %rd3;
        @%p1 bra        BB6_1;

        ret;
}

我读到的是,这段代码总是至少复制一个字节,因为长度参数的值直到字节复制之后才会被测试。就像这样:

代码语言:javascript
复制
BB6_1:
        setp.ge.u64     %p1, %rd14, %rd3;
        @%p1 bra        Done;
        add.s64         %rd12, %rd2, %rd14;
        ld.global.u8    %rs1, [%rd12];
        add.s64         %rd13, %rd1, %rd14;
        st.global.u8    [%rd13], %rs1;
        add.s64         %rd14, %rd14, 1;
        bra             BB6_1;
Done:

可能会像预期的那样起作用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37790572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档