学到了cudaMemcpyToSymbol竟然还有将数据从host拷贝到global的功能,以前只用过这个函数拷贝到constant memory。拷贝方式的不同是由目的内存申请的方式决定的。
申请的是device内存,cudaMemcpyToSymbol拷贝就是从host拷贝到global memory。
申请的是constant内存,cudaMemcpyToSymbol拷贝就是从host拷贝到constant memory。
__device__ float g_damp_x[MAX_DIM];
__constant__ float c_damp_y[MAX_DIM];
main.cu
#include "error.cuh"
#include <stdio.h>
__device__ int d_x = 1;
__device__ int d_y[2];
void __global__ my_kernel(void)
{
d_y[0] += d_x;
d_y[1] += d_x;
printf("d_x = %d, d_y[0] = %d, d_y[1] = %d.\n", d_x, d_y[0], d_y[1]);
}
int main(void)
{
int h_y[2] = {10, 20};
CHECK(cudaMemcpyToSymbol(d_y, h_y, sizeof(int) * 2));
my_kernel<<<1, 1>>>();
CHECK(cudaDeviceSynchronize());
CHECK(cudaMemcpyFromSymbol(h_y, d_y, sizeof(int) * 2));
printf("h_y[0] = %d, h_y[1] = %d.\n", h_y[0], h_y[1]);
return 0;
}
#pragma once
#include <stdio.h>
#define CHECK(call) \
do \
{ \
const cudaError_t error_code = call; \
if (error_code != cudaSuccess) \
{ \
printf("CUDA Error:\n"); \
printf(" File: %s\n", __FILE__); \
printf(" Line: %d\n", __LINE__); \
printf(" Error code: %d\n", error_code); \
printf(" Error text: %s\n", \
cudaGetErrorString(error_code)); \
exit(1); \
} \
} while (0)
参考:
https://blog.youkuaiyun.com/u014800094/article/details/53994933?utm_source=blogxgwz5
本文深入探讨了cudaMemcpyToSymbol函数的使用,特别是在从主机内存复制数据到设备全局内存和常数内存的区别。通过示例代码,展示了如何利用该函数更新设备上的变量,并通过kernel调用来验证数据的正确性。
5259

被折叠的 条评论
为什么被折叠?



