我正在用memcpy从gpu memory向gpu memory拷贝数据,数据为long long int (8bytes).
我的一个block里面有32个threads. 结果对于每个threadIdx.x = 16的thread,要拷贝的8bytes的最低一个bytes一直拷不过去。
如果用赋值的话,则8个bytes都拷不过去。
但是用printf输出源数据个8个bytes是完全正确的。
LZ您好:
从未遇到过您这样的问题,估计是您代码的问题,请您提供您代码和出错的详情。
感谢合作。
已经找到原因,是kernel函数里的memcpy问题,我发现如果memcpy的size = 0,那么它仍然拷贝一个byte过去,不知道这是什么原因?附上一个小程序,您可以看到仍有一个byte被改了
#include <iostream>
#include "cuda.h"
#include "cuda_runtime.h"
#include "device_functions.h"
using namespace std;
__global__ void copy(char *dev)
{
char temp = 'g';
memcpy(dev + 10,&temp,0);
}
int main( )
{
char *host = new char [32];
char *host1 = new char [32];
char *dev;
host = "abbbbbbbbbbbbbbbbbbbbbbbbbbb";
cudaError error1 = cudaMalloc(&dev,32);
cudaError error2 = cudaMemcpy(dev,host,32,cudaMemcpyHostToDevice);
copy<<<1,1>>>(dev);
cudaError error3 = cudaMemcpy(host1,dev,32,cudaMemcpyDeviceToHost);
cout<<host1<<endl;
return 0;
}
楼主您好,请不要使用任何未定义的行为:
例如:
(1)复制大小为0或者负数的
(2)输入或者输出指针为NULL或者无效的
(3)输入区域或者输出区域重叠的
它们均不是memcpy()的设计原意,并将导致未定义的行为(根据不同的实现将展现出不同的随机行为),感谢来访。