C++ 如何在CUDA中将数据从无符号整数复制到ulong4
.h文件:C++ 如何在CUDA中将数据从无符号整数复制到ulong4,c++,cuda,memcpy,C++,Cuda,Memcpy,.h文件: #define VECTOR_SIZE 1024 .cpp文件: int main () { unsigned int* A; A = new unsigned int [VECTOR_SIZE]; CopyToDevice (A); } .cu文件: void CopyToDevice (unsigned int *A) { ulong4 *UA unsigned int VectorSizeUlong4 = VECTOR_SIZ
#define VECTOR_SIZE 1024
.cpp文件:
int main ()
{
unsigned int* A;
A = new unsigned int [VECTOR_SIZE];
CopyToDevice (A);
}
.cu文件:
void CopyToDevice (unsigned int *A)
{
ulong4 *UA
unsigned int VectorSizeUlong4 = VECTOR_SIZE / 4;
unsigned int VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);
cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// how to use cudaMemcpy to copy data from A to UA?
// I tried to do the following but it gave access violation error:
for (int i=0; i<VectorSizeUlong4; ++i)
{
UA[i].x = A[i*4 + 0];
UA[i].y = A[i*4 + 1];
UA[i].z = A[i*4 + 2];
UA[i].w = A[i*4 + 3];
}
// I also tried to copy *A to device and then work on it instead going back to CPU to access *A every time but this did not work again
}
void CopyToDevice(无符号int*A)
{
乌龙4*UA
unsigned int VectorSizeUlong4=向量大小/4;
无符号int-VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
//如何使用cudaMemcpy将数据从A复制到UA?
//我尝试执行以下操作,但出现访问冲突错误:
对于(int i=0;i这将引起所有警报:
cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// ...
UA[i].x = A[i*4 + 0];
您正在设备上分配UA,然后在主机代码中使用它。永远不要这样做。您需要使用cudaMemcpy
将数组复制到设备上。显示了一个使用cudaMemcpy复制内容的基本程序。cudaMemcpy的length参数是数组的长度(以字节为单位)。在您的情况下,这就是VECTOR\u SIZE*sizeof(unsigned int)
这应该会引起所有的警钟:
cudaMalloc( (void**)&UA, VectorSizeBytesUlong4 );
// ...
UA[i].x = A[i*4 + 0];
您正在设备上分配UA,然后在主机代码中使用它。永远不要这样做。您需要使用cudaMemcpy
将数组复制到设备上。显示了一个使用cudaMemcpy复制内容的基本程序。cudaMemcpy的length参数是数组的长度(以字节为单位)。在您的情况下,这就是VECTOR\u SIZE*sizeof(unsigned int)
CUDAulong4
是一个16字节对齐的结构,定义为
struct __builtin_align__(16) ulong4
{
unsigned long int x, y, z, w;
};
这意味着要用于填充ulong4
流的四个连续32位无符号源整数流的大小相同。最简单的解决方案包含在您发布的图像上的文本中-仅强制转换(隐式或显式)指向ulong4
指针的unsigned int
指针,直接在主机和设备内存上使用cudaMemcpy
,并将生成的设备指针传递给任何需要ulong4
输入的内核函数。设备传递函数可能类似于:
ulong4* CopyToDevice (unsigned int* A)
{
ulong4 *UA, *UA_h;
size_t VectorSizeUlong4 = VECTOR_SIZE / 4;
size_t VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);
cudaMalloc( (void**)&UA, VectorSizeBytesUlong4);
UA_h = reinterpret_cast<ulong4*>(A); // not necessary but increases transparency
cudaMemcpy(UA, UA_h, VectorSizeBytesUlong4);
return UA;
}
ulong4*CopyToDevice(unsigned int*A)
{
ulong4*UA,*UA_h;
size_t VectorSizeUlong4=向量大小/4;
size_t VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
UA_h=重新解释(A);//不需要,但增加了透明度
cudaMemcpy(UA、UA_h、VectorSizeBytesUlong4);
返回UA;
}
[通常免责声明:在浏览器中编写,未经测试或编译,使用风险自负]CUDAulong4
是一个16字节对齐的结构,定义为
struct __builtin_align__(16) ulong4
{
unsigned long int x, y, z, w;
};
这意味着要用于填充ulong4
流的四个连续32位无符号源整数流的大小相同。最简单的解决方案包含在您发布的图像上的文本中-仅强制转换(隐式或显式)指向ulong4
指针的unsigned int
指针,直接在主机和设备内存上使用cudaMemcpy
,并将生成的设备指针传递给任何需要ulong4
输入的内核函数。设备传递函数可能类似于:
ulong4* CopyToDevice (unsigned int* A)
{
ulong4 *UA, *UA_h;
size_t VectorSizeUlong4 = VECTOR_SIZE / 4;
size_t VectorSizeBytesUlong4 = VectorSizeUlong4 * sizeof(ulong4);
cudaMalloc( (void**)&UA, VectorSizeBytesUlong4);
UA_h = reinterpret_cast<ulong4*>(A); // not necessary but increases transparency
cudaMemcpy(UA, UA_h, VectorSizeBytesUlong4);
return UA;
}
ulong4*CopyToDevice(unsigned int*A)
{
ulong4*UA,*UA_h;
size_t VectorSizeUlong4=向量大小/4;
size_t VectorSizeBytesUlong4=VectorSizeUlong4*sizeof(ulong4);
Cudamaloc((void**)和UA,VectorSizeBytesUlong4);
UA_h=重新解释(A);//不需要,但增加了透明度
cudaMemcpy(UA、UA_h、VectorSizeBytesUlong4);
返回UA;
}
[常见免责声明:使用浏览器编写,未经测试或编译,使用风险自负]源和目标的总大小在代码中不相同。是否要执行元素到元素的复制?即使在这种情况下,源和目标中的元素数也不匹配。粗略的方法是先复制到大小相同的设备内存(例如temp
)然后编写自己的内核从temp
逐个复制到UA
。源和目标的总大小在代码中不相同。是否要执行元素到元素的复制?即使在这种情况下,源和目标中的元素数也不匹配。粗略的方法是复制到相同大小的设备内存中首先调整大小(比如说temp
),然后编写自己的内核从temp
一个接一个地复制到UA
。我认为unsigned long
通常是64位(8字节)在64位操作系统机器上。我意识到它依赖于实现,所以我说的是一般术语。在64位linux机器上,根据我的经验,sizeof(ulong4)
将是32,大小相当于8个32位的量。这对我来说,当从无符号int
转换到ulong4
时,会产生一个问题,你是只想扩展4个量,还是想将8个量打包到ulong4
?@RobertCrovella:至少在MS平台上是这样(这是我所检查的全部内容),无符号长整型在32位和64位主机操作系统上都是32位的量。如果事实证明ulong4是64位的量,那么复制/分配内核可能最有意义。UA_h=reinterpret_cast(a);
给出了错误:转换为类型“ulong4”不允许
。因此我将其更改为
UA_h=reinterpret_cast(A);@Shibli:这是一个打字错误-正如我在免责声明中所说,我在broswerI中编写了此代码,我认为无符号长
通常是64位(8字节)在64位操作系统机器上。我意识到它依赖于实现,所以我说的是一般术语。在64位linux机器上,根据我的经验,sizeof(ulong4)
将是32,大小相当于8个32位的量。对于我来说,当从无符号int
转换到ulong4
时,这就引出了一个问题,您是只想扩展4个量,还是想将8个量打包成一个ulong4