如其他问题所述并根据链接,您不能再使用此功能的符号名称.现在该功能已经消失,什么时候才能使用它cudaMemCpy?你什么时候想要使用它?什么是权衡或利益?
我想弄明白为什么cudaMemcpyFromSymbol()存在.似乎'符号'func可以做的一切,nonSymbol cmds可以做到.
符号func似乎可以轻松移动数组或索引的一部分,但这可以很容易地使用nonSymbol函数完成.我怀疑nonSymbol方法会运行得更快,因为不需要符号查找.(目前尚不清楚符号查找计算是在编译还是运行时完成.)
我为什么要用cudaMemcpyFromSymbol()vs cudaMemcpy()?
嘿那里,我有以下代码:
#if USE_CONST == 1
__constant__ double PNT[ SIZE ];
#else
__device__ double *PNT;
#endif
Run Code Online (Sandbox Code Playgroud)
稍后我有:
#if USE_CONST == 0
cudaMalloc((void **)&PNT, sizeof(double)*SIZE);
cudaMemcpy(PNT, point, sizeof(double)*SIZE, cudaMemcpyHostToDevice);
#else
cudaMemcpyToSymbol(PNT, point, sizeof(double)*SIZE);
#endif
Run Code Online (Sandbox Code Playgroud)
而point在之前的代码中定义的地方.当处理USE_CONST=1所有事情按预期工作时,但在没有它的情况下工作,而不是工作.我通过我的内核函数访问数组
PNT[ index ]
这两种变体之间的问题在哪里?谢谢!
我正在尝试对__device__变量应用内核函数,根据规范,它位于"全局内存"中
#include <stdio.h>
#include "sys_data.h"
#include "my_helper.cuh"
#include "helper_cuda.h"
#include <cuda_runtime.h>
double X[10] = {1,-2,3,-4,5,-6,7,-8,9,-10};
double Y[10] = {0};
__device__ double DEV_X[10];
int main(void) {
checkCudaErrors(cudaMemcpyToSymbol(DEV_X, X,10*sizeof(double)));
vector_projection<double><<<1,10>>>(DEV_X, 10);
getLastCudaError("oops");
checkCudaErrors(cudaMemcpyFromSymbol(Y, DEV_X, 10*sizeof(double)));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
内核函数vector_projection定义my_helper.cuh如下:
template<typename T> __global__ void vector_projection(T *dx, int n) {
int tid;
tid = threadIdx.x + blockIdx.x * blockDim.x;
if (tid < n) {
if (dx[tid] < 0)
dx[tid] = (T) 0;
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我用cudaMemcpyToSymbol和cudaMemcpyFromSymbol …