【发布时间】:2019-04-07 05:15:07
【问题描述】:
我有以下sn-p的代码:
#include <stdio.h>
struct Nonsense {
float3 group;
float other;
};
__global__ void coalesced(float4* float4Array, Nonsense* nonsenseArray) {
float4 someCoordinate = float4Array[threadIdx.x];
someCoordinate.x = 5;
float4Array[threadIdx.x] = someCoordinate;
Nonsense nonsenseValue = nonsenseArray[threadIdx.x];
nonsenseValue.other = 3;
nonsenseArray[threadIdx.x] = nonsenseValue;
}
int main() {
float4* float4Array;
cudaMalloc(&float4Array, 32 * sizeof(float4));
cudaMemset(float4Array, 32 * sizeof(float4), 0);
Nonsense* nonsenseArray;
cudaMalloc(&nonsenseArray, 32 * sizeof(Nonsense));
cudaMemset(nonsenseArray, 32 * sizeof(Nonsense), 0);
coalesced<<<1, 32>>>(float4Array, nonsenseArray);
cudaDeviceSynchronize();
return 0;
}
当我通过 Nsight 中的 Nvidia 分析器运行它并查看全局内存访问模式时,float4Array 具有完美的合并读取和写入。同时,Nonsense 数组的访问模式很差(因为它是一个结构数组)。
NVCC 是否会自动将 float4 数组(在概念上是结构数组)转换为数组结构,以获得更好的内存访问模式?
【问题讨论】: