所以,我对整个 KB / KiB 概念感到困惑。我在数据表中读到特定 L2 缓存具有 256KB 容量。从其他来源我读到大小为 256 kB。
有时当人们写 KB 或 kB 时,他们的意思是 KiB,有时则不是。我对内存的有限了解使我相信缓存大小应该是两个字节的幂。
在缓存大小的上下文中,内存大小更可能是 256 000 字节还是 2^10*256=262 144 字节?
编辑:不是实际的数据表,但作为一个例子,看看这个 AMD 处理器上的 L1 缓存。
所以我想做这样的事情
#ifdef MYCOND
#define CR_BEGIN #pragma omp critical{
#define CR_END }
#else
#define CR_BEGIN
#define CR_END
#endif
Run Code Online (Sandbox Code Playgroud)
由于标签,GCC(4.8.2)不喜欢第2行.SO处的相关问题给出了答案"使用_Pragma("")",但在这种情况下它不起作用.
建议?
我想使用带双打的纹理对象(不是引用).使用浮点数时,下面的代码有效,但double不是受支持的数据类型.
我可以使用2d纹理解决这个问题,如果是这样,我该如何设置这样的纹理?
纹理引用有类似的问题,但纹理对象没有.在CUDA中支持纹理存储器中的双重类型
__global__ void my_print(cudaTextureObject_t texObject)
{
printf("%f\n",tex1Dfetch<double>(texObject,0));
return;
}
int main()
{
double i = 0.35;
int numel = 50;
double* d_data;
cudaMalloc(&d_data,numel*sizeof(double));
cudaMemcpy((void*)d_data,&i,1*sizeof(double), cudaMemcpyHostToDevice);
cudaTextureDesc td;
memset(&td, 0, sizeof(td));
td.normalizedCoords = 0;
td.addressMode[0] = cudaAddressModeClamp;
td.readMode = cudaReadModeElementType;
struct cudaResourceDesc resDesc;
memset(&resDesc, 0, sizeof(resDesc));
resDesc.resType = cudaResourceTypeLinear;
resDesc.res.linear.devPtr = d_data;
resDesc.res.linear.sizeInBytes = numel*sizeof(double);
resDesc.res.linear.desc.f = cudaChannelFormatKindFloat;
resDesc.res.linear.desc.x = 32;
cudaTextureObject_t texObject = 0;
gpuErrchk(cudaCreateTextureObject(&texObject, &resDesc, &td, NULL));
my_print<<<1,1>>>(texObject);
gpuErrchk(cudaDeviceSynchronize());
return 0;
}
Run Code Online (Sandbox Code Playgroud)