我正在研究a quiz on Udacity并遇到一个非常奇怪的问题:
#include "reference_calc.cpp"
#include "utils.h"
void your_histogram_and_prefixsum(const float* const d_logLuminance,
unsigned int* const d_cdf,
float &min_logLum,
float &max_logLum,
const size_t numRows,
const size_t numCols,
const size_t numBins)
{
float* an_array;
cudaMalloc(&an_array, sizeof(float) * 1);
cudaMemset(an_array, 0, 1);
//cudaMemset(an_array, d_logLuminance[0], 1);
}
该程序除了为数组分配(
cudaMalloc
)一些内存并将其第一个子索引设置为(cudaMemset
)为0以外,什么也不做。一切顺利,直到我改变
cudaMemset(an_array, 0, 1);
至
cudaMemset(an_array, d_logLuminance[0], 1);
程序编译但失败:
我们无法执行您的代码。您是否正确设置了网格和/或块大小?
我不知道为什么我不能将
d_logLuminance[0]
传递给cudaMemset
。有人可以帮我吗?
最佳答案
cudaMemset中的值是字节值,而不是字值。与C标准库memset中的相同。
正如您所发现的,cudaMemset的工作方式类似于C标准库memset。引用文档:
cudaError_t cudaMemset ( void * devPtr,
int value,
size_t count
)
用恒定字节值填充由devPtr指向的存储区域的第一个计数字节。
因此,值是一个字节值。如果您执行以下操作:
int *devPtr;
cudaMalloc((void **)&devPtr,number_bytes);
const int value = 5;
cudaMemset(devPtr,value,number_bytes);
您要执行的操作是将devPtr的每个字节都设置为5。如果devPtr是整数数组,则结果将是每个整数字的值都为84215045。这可能与您的想法不符。
关于c - cudaMemset无法获取参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41073229/